2012-07-26 29 views
0

我一直使用NSCalendar和NSDateComponents来返回两个日期之间的差异(天)。这是我用来获取该代码的代码。iOS - TimeZone问题与2个NSDates之间的差异

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点(我使用山区标准时间,也就是北京时间我认为),它停止正常工作。它不是返回正确的差值,而是返回差值减1天。所以例如,它返回-1而不是0或1而不是2.

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

任何想法?

谢谢!

+1

你需要在*之前用'[日历组件...]'来使用时区*。 – 2012-07-26 01:31:20

回答

0

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

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