7

我有格式的数据

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

ETC

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

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

我怎么能用 NSDate 做到这一点?

4

5 回答 5

13

这是一个 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)
    }
}
于 2017-05-02T18:47:46.977 回答
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 日期

于 2013-06-10T07:20:39.150 回答
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)
}
于 2014-10-11T09:04:36.433 回答
4

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

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

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

extension Date {
    func nearestHour() -> Date {
        return Date(timeIntervalSinceReferenceDate:
                (timeIntervalSinceReferenceDate / 3600.0).rounded(.toNearestOrEven) * 3600.0)
    }
}
于 2018-11-27T13:52:07.467 回答
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);
}
于 2013-06-10T07:13:47.253 回答