在iOS中将NSdate四舍五入到最近的小时

Posted

技术标签:

【中文标题】在iOS中将NSdate四舍五入到最近的小时【英文标题】:Rounding of NSdate to nearest hour in iOS 【发布时间】:2013-06-10 07:03:04 【问题描述】:

我有格式的数据

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

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

喜欢 13:52 -> 14:00、10:30 -> 11:00 和 11:48 -> 12:00。

如何使用 NSDate 做到这一点?

【问题讨论】:

1.将您的 NSDate 拆分为组件 2. 添加 if-else 并检查分钟是否大于 30 3. 将分钟数归零并将小时数增加一或不执行任何操作。就是这样。简单的数学:-) 【参考方案1】:

这是一个使用 Date 扩展名获取最近小时的 Swift 3.0 实现:

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)
    

【讨论】:

是否也需要去掉秒数? 秒,我修改上面得到秒,然后将 components.seconds 设置为 -components.seconds【参考方案2】:

使用这个方法

- (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 日期

【讨论】:

嘿嗨@Lithu T.v,我正在将时区设置为UTC,如果我使用你的代码,如果系统时间(印度时间)是下午6.10,我得到下午7.30,同样我改变时间在设置下的设备上将区域设置为美国,然后尝试,如果时间是上午 8.20,我会得到上午 9.00。我不明白为什么? 这更像是一个 ceil 函数。如果您有 10:15,则不会四舍五入为 10。而是改为 11:15。【参考方案3】:
 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】:

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

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

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

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

【讨论】:

这是基于从 00:00 开始的参考日期。但是leap seconds呢?【参考方案5】:

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

  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);

【讨论】:

以上是关于在iOS中将NSdate四舍五入到最近的小时的主要内容,如果未能解决你的问题,请参考以下文章

在R中将时间四舍五入到最接近的小时[重复]

如果在函数中将数字四舍五入,则将其四舍五入

将double转换为字符串时,如何在C#中将其四舍五入到N个小数位? [复制]

在 C 中将正值四舍五入到小数点后 2 位

UIScrollView 子视图在按比例缩小时错位,而子视图在四舍五入时不显示

如何将日期时间列四舍五入到最近的一刻钟