没有夏令时的日期计算

时间:2013-11-25 00:52:03

标签: objective-c cocoa nsdate dst nstimezone

我正在尝试为计划应用执行日期计算,但遇到了夏令时问题。我正在尝试确定两个日期之间的天数:

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月1日至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小时。我担心增加的计算时间,因为我的应用程序计算给定开始日期和其他日期数组之间的日期。此数组最多可包含2,000个日期。我不确定这是否是一个合法的问题......
  • 创建不受DST影响的自定义时区。这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

我可以使用10月27日(英国夏令时开始时)的日期确认您的观察结果,并将时区设置为欧洲/伦敦。 “n天24小时”似乎是一个怪癖(对于一个错误,有人忘了随身携带)。

解决方案1:使用NSCalendar设置为UTC。 UTC没有夏令时。

解决方案2:由于所有时间都在午夜,最大夏令时变化为1小时,因此“日”时间为23至25小时。为此,只需同时处理怪癖:

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

请注意,此有效,因为两个日期的时间相同!