iOS - TimeZone问题,2个NSDates之间存在差异

时间:2012-07-26 01:14:42

标签: objective-c nsdate nscalendar nsdatecomponents nstimezone

我一直在使用NSCalendar和NSDateComponents来返回两个日期之间的差异(以天为单位)。这是我用来获得它的代码。

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

NSDate *todayDate = [NSDate date];
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                                 fromDate:todayDate];
[comps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate *today = [calendar dateFromComponents:comps];

NSDate *startDate = self.date;
NSDate *endDate =  today;
NSLog(@"startDate: %@",startDate);
NSLog(@"endDate: %@",endDate);

NSDateComponents *components = [calendar components:NSDayCalendarUnit
                                            fromDate:endDate
                                              toDate:startDate
                                             options:0];
[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSInteger days = [components day];

奇怪的是,这在一天的早些时候完美无缺,但是一旦我到达大约6点或7点(我正在使用山地时间,我认为是GMT-7),它就会停止正常工作。它不是返回正确的差异,而是返回差值减去1天。所以例如,它返回-1而不是0,或1而不是2。

我猜这是一个时区问题。有谁知道如何修理它?我已经尝试为我的NSCalendar和NSDateComponents设置timeZone到GMT,本地和系统,但似乎没有工作。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来代码没有处理天数之间的小数差异。例如,如果开始日期是昨天晚上11:59,结束日期是今天上午12:01,则​​代码会将差异报告为0天。如果你认为这是1天的差异,那么代码需要处理这种情况。

如果您使用日期选择器选择self.date,则self.date包含日期加上当前本地时间。在当地时间下午6点或7点,这是格林威治标准时间午夜(即明天WRT当地时间),这会导致您的差异计算中出现意外的-1。