【问题标题】:How to skip time in NSDate?如何在 NSDate 中跳过时间?
【发布时间】:2012-02-09 17:50:12
【问题描述】:

我想得到日期之间的差异跳过时间意味着如果一个日期是 2012 年 1 月 13 日 - 晚上 11 点,另一个日期是 2012 年 1 月 14 日 - 上午 12 点,那么差异应该是 1 天而不是 0 天。我的意思是我想要仅日期,2012 年 1 月 14 日 - 2012 年 1 月 13 日,跳过时间。我知道我可以使用 NSDate api 来计算差异,但问题是它也考虑时间。所以我想在计算差异时我会跳过时间但我不知道如何跳过时间,因为如果我使用 NSDateFormatter 它会返回字符串而不是日期。请帮我做点什么?

提前致谢!

【问题讨论】:

    标签: objective-c nsdate


    【解决方案1】:

    您需要先获取每个日期的NSDateComponents。一旦你这样做了,你就可以比较“天”组件来让你与众不同。

    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    NSDate *date1 = ....;
    NSDate *date2 = ....;
    NSDateComponents *comps1 = [cal components:NSDayCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit fromDate:date1];
    NSDateComponents *comps2 = [cal components:NSDayCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit fromDate:date2];
    
    date1 = [cal dateFromComponents:comps1];
    date2 = [cal dateFromComponents:comps2];
    
    NSDateComponents *diffComps = [cal components:NSDayCalendarUnit fromDate:date1 toDate:date2 options:0];
    
    NSLog(@"Days diff = %d", diffComps.day);
    

    日期 API 可能有点奇怪,但一旦你这样做了,它就会非常强大。

    【讨论】:

    • 如果年月有差异怎么办?这只是一个例子。
    • 很抱歉问了这个问题,但我真的不明白,什么是“initWithCalendarIdentifier”?如果 ipad 中的日历被更改了怎么办?
    • 这是一种命名的日历样式。 NSGregorianCalendar 是西方世界使用的标准日历,但 api 允许您根据需要选择其他日历。它不是那种在设备之间改变的东西。
    • 我明白了你的意思,但我的问题是如果在代码中我使用 NSGregorianCalendar 并计算差异,如果用户从 ipad 更改日历样式,那么我的 api 将不会返回正确的值,对吗?
    • @Nuzhat Zari:尝试使用[NSCalendar currentCalendar] 获取用户的日历。
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多