首页 文章

NSCalendar组件没有花时间考虑

提问于
浏览
1

我们知道NSDate是UTC / GMT . 换句话说,没有时区信息与之关联 .

有一些高级类,如NSCalendar和NSTimeZone以及NSDateComponents,它们都考虑了时区 .

基于此,我使用以下代码计算两个日期之间的天数差异 . 然而,我得到的结果似乎是完全无视时间完成计算 . 我想知道我是做错了什么,或者这是出于某种原因设计的 .

这是代码和数据:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:stopDate options:0];
NSInteger day = [comp day];

调试输出:

(gdb) po startDate
2011-04-01 03:52:13 +0000
(gdb) po stopDate
2011-04-03 15:52:13 +0000
(gdb) p (int) day
$1 = 2

时区是太平洋标准时间,上面转换为PST的日期是:

startDate = 2011-03-31 8:52:13 -7
stopDate  = 2011-04-03 8:52:13 -7

因此我希望他们之间有4天,而不是2天 . (31日,1日,2日和3日)

我认为小时数被忽略的原因是因为如果计算中加入小时,我们得到2天12小时 .

我做错了什么,或者这是如何设计的?

万荣,谢谢

1 回答

  • 0

    不完全的 . 在太平洋时区格式化日期时,您会得到:

    Calendars[38041:707] start: 2011-03-31 20:52:13 -0700
    Calendars[38041:707] stop : 2011-04-03 08:52:13 -0700
    

    这与您发布的内容略有不同 . 你好像是早上8点,而不是晚上8点 .

    此外, components:fromDate:toDate:options: 将计算整个单位 . 因此,如果你说他们之间有两整天,那就是 .

    也许更好的方法来做你正在寻找的是这个:

    NSUInteger startOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:startDate];
    NSUInteger stopOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:stopDate];
    

    然后他们之间的天数将是 (stopOrdinal - startOrdinal) . 在您的日期的情况下,这产生3(格林尼治标准时间4月1日 - 格林威治标准时间4月3日) . 如果你真的想忽略时间部分,你将不得不弄清楚如何在目标时区内砍掉日期的时间部分 . 这将涉及将日期转换为 NSDateComponent 对象,然后将 -hour-minute-second 部分设置为0.一旦完成,您可以将它们更改回 NSDates ,然后继续进行差异计算 .

相关问题