我正在尝试为计划应用执行日期计算,但遇到了夏令时问题。我正在尝试确定两个日期之间的天数:
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.viewBeginDate
和item.ES
都是NSDate对象,self.calendar
是格里高利历。
这是我的输出:
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个日期。我不确定这是否是一个合法的问题...... 答案 0 :(得分:2)
我可以使用10月27日(英国夏令时开始时)的日期确认您的观察结果,并将时区设置为欧洲/伦敦。 “n天24小时”似乎是一个怪癖(对于一个错误,有人忘了随身携带)。
解决方案1:使用NSCalendar
设置为UTC。 UTC没有夏令时。
解决方案2:由于所有时间都在午夜,最大夏令时变化为1小时,因此“日”时间为23至25小时。为此,只需同时处理怪癖:
daysBetween = [activityComponents day] + ([activityComponents hour] >= 23 ? 1 : 0);
请注意,此仅有效,因为两个日期的时间相同!