Date calculations without daylight savings time
我正在尝试为计划应用程序执行日期计算,但遇到了夏令时问题。我正在尝试确定两个日期之间的天数:
1 2 3 4 5 6 | 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]); |
其中
- 在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
再次!
这是我的输出:
1 2 3 4 5 | 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
我的
我想到了两种可能的选择:
-
如果日期为夏令时,请使用
isDaylightSavingTime 检查每个日期并创建新的(修改的)日期偏移量1小时。我担心增加的计算时间,因为我的应用程序计算给定开始日期和其他日期数组之间的日期。此数组最多可包含2,000个日期。我不确定这是否是一个合法的问题...... - 创建不受DST影响的自定义时区。这甚至可能吗?
我可以使用10月27日左右(英国夏令时开始时)的日期确认您的观察结果,并将时区设置为欧洲/伦敦。"n天24小时"似乎是一个怪癖(对于一个臭虫,有人忘了随身携带)。
解决方案1:使用
解决方案2:由于所有时间都在午夜,最大夏令时变化为1小时,因此"日"时间为23至25小时。 为了实现这一点,并同时处理怪癖:
1 | daysBetween = [activityComponents day] + ([activityComponents hour] >= 23 ? 1 : 0); |
请注意,这只能起作用,因为两个日期的时间相同!