我们知道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小时。
我做错了什么,或者这是如何设计的?
谢谢你, 万斯
答案 0 :(得分: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
,然后继续你的差异计算。