iOS 中 NSdate 舍入到最近的小时

问题描述 投票:0回答:7

我有以下格式的数据

时间:13:52、10:30、11:48

等等

我想四舍五入到最接近的小时。

例如 13:52 -> 14:00、10:30 -> 11:00 和 11:48 -> 12:00。

如何使用 NSDate 做到这一点?

iphone ios nsdate nscalendar nsdatecomponents
7个回答
16
投票

这是一个 Swift 3.0 实现,它使用

Date
扩展获取最接近的小时:

extension Date {
    func nearestHour() -> Date? {
        var components = NSCalendar.current.dateComponents([.minute], from: self)
        let minute = components.minute ?? 0
        components.minute = minute >= 30 ? 60 - minute : -minute
        return Calendar.current.date(byAdding: components, to: self)
    }
}

9
投票

使用这个方法

- (NSDate*) nextHourDate:(NSDate*)inDate{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components: NSEraCalendarUnit|NSYearCalendarUnit| NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit fromDate: inDate];
    [comps setHour: [comps hour]+1]; //NSDateComponents handles rolling over between days, months, years, etc
    return [calendar dateFromComponents:comps];
}

这将为您提供 inDate 下一小时的日期


4
投票
 func nextHourDate() -> NSDate? {
    let calendar = NSCalendar.currentCalendar()
    let date = NSDate()
    var minuteComponent = calendar.components(NSCalendarUnit.MinuteCalendarUnit, fromDate: date)
    let components = NSDateComponents()
    components.minute = 60 - minuteComponent.minute
    return calendar.dateByAddingComponents(components, toDate: date, options: nil)
}

4
投票

由于以下几个原因,使用组件并不可靠:

  1. 不考虑秒数
  2. 添加秒数时,很少会错过一秒

我在 Swift 4.* 中找到的最可靠的方法是:

extension Date {
    func nearestHour() -> Date {
        return Date(timeIntervalSinceReferenceDate:
                (timeIntervalSinceReferenceDate / 3600.0).rounded(.toNearestOrEven) * 3600.0)
    }
}

0
投票

使用下面的代码。一定对你有帮助。

  NSString *dateString=@"17:15";
    NSArray *strings = [dateString componentsSeparatedByString:@":"];

int firstPart=[[NSString stringWithFormat:@"%@",strings[0]] intValue];
int lastPart=[[NSString stringWithFormat:@"%@",strings[1]] intValue];

NSLog(@"LAST:%d",firstPart);

if (lastPart>0) {

    int output=firstPart+1;



    NSString *finalOutput=[NSString stringWithFormat:@"%d:00",output];

     NSLog(@"OUTPUT:%@",finalOutput);
}
else
{
     NSLog(@"OUTPUT:%@",dateString);
}

0
投票

这是 Swift 4/5 版本 -

func nextHourDate() -> Date? {
    let calendar = Calendar.current
    let date = Date()
    var minuteComponent = calendar.component(.minute, from: date)
    var components = DateComponents()
    components.minute = 60 - minuteComponent
    return calendar.date(byAdding: components, to: date)
}

0
投票
func nextHour() -> Date? {
    guard let date = Calendar.current.date(byAdding: .hour, value: 1, to: self) else { return nil }
    return Calendar.current.dateComponents([.era, .year, .month, .day, .hour], from: date).date
}
© www.soinside.com 2019 - 2024. All rights reserved.