2013-11-25 26 views
0

我试图对日程安排应用程序执行日期计算,但遇到夏令时问题。我试图确定与两个日期之间的天数:无夏时制时间的日期计算

NSDateComponents *activityComponents = [[NSDateComponents alloc]init]; 
activityComponents = [self.calendar components:NSDayCalendarUnit 
             fromDate:self.viewBeginDate 
             toDate:item.ES 
             options:0]; 
NSLog(@"Days: %d and hours: %d", [activityComponents day], [activityComponents hour]); 

其中self.viewBeginDateitem.ES都是NSDate的对象和self.calendar是公历。

  • 2013年11月1日和2013年11月1日之间的计算的情况下,它提供了0。
  • 2013年11月1日和2013年11月2日之间计算的情况下,它提供了1.
  • 十一月间计算当2013年11月3日和2013年11月3日,它提供了2.
  • 在2013年11月1日至2013年11月4日期间计算时,它再次提供2 !

这里是我的输出:

Days: 0 and hours: 0 
    Days: 1 and hours: 0 
    Days: 2 and hours: 0 
    Days: 2 and hours: 24 
    Days: 3 and hours: 23 

我希望能够确定2个NSDate对象之间的天数,而不通过夏令时的影响,因为我的应用程序不关心本地或用户所在的时区。我只想告诉我,2013年11月1日至2013年11月4日之间有3天。有什么想法?

我的NSDate对象是使用以下格式的字符串创建的:2013-11-01 00:00:00 +0000。每个日期的时间设置为00:00:00,GMT偏移量为+0000。

我想到了两个可能的选择:

  • 使用isDaylightSavingTime检查每个日期并创建一个新的(修改)日期1个小时的偏差,如果它的日期是夏令时。我很担心增加的计算时间,因为我的应用程序计算给定开始日期和其他日期数组之间的日期。这个数组最多可以有2000个日期。我不确定这是否是合法的问题...
  • 创建不受DST影响的自定义时区。这甚至有可能吗?
+1

只需将您的NSCalendar设置为UTC即可。 –

+0

我已将日历更改为UTC,结果没有任何差异。我做对了吗? '[自我。日历setTimeZone:[NSTimeZone timeZoneWithName:@ “UTC”];' – dfro

+0

我列出了用'的NSLog的时区(@ “%@”,[NSTimeZone knownTimeZoneNames]);',并获得在喜欢一个长长的清单“美国/诸如此类“和”欧洲/诸如此类“甚至格林尼治标准时间,但我没有看到UTC。它不总是可用吗? – dfro

回答

2

我可以使用10月27日左右(英国夏令时开始时)的日期和欧洲/伦敦时区设置来确认您的观察结果。 “n天24小时”似乎是一个怪癖(善良的词语为一个错误,有人忘记携带)。

解决方案1:使用设置为UTC的NSCalendar。 UTC没有夏令时。解决方案2:由于您所有的时间都在午夜,最大夏令时时间为1小时,因此“一天”在23到25小时之间。考虑到这一点,并在同一时间简单地处理怪癖:

daysBetween = [activityComponents day] + ([activityComponents hour] >= 23 ? 1 : 0); 

注意,这仅作品因为时间是在这两个日期是一样的!

+0

它的工作;我设置了'NSCalendar'到UTC与'[self.calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@“UTC”];'我没有得到UTC早期工作,因为我被错误地尝试设置时区之前,我初始化日历。一旦我将它移到alloc之后,init位就可以正常工作。感谢你的帮助! – dfro