没有夏令时的日期计算
Posted
技术标签:
【中文标题】没有夏令时的日期计算【英文标题】:Date calculations without daylight savings time 【发布时间】:2013-12-09 14:16:40 【问题描述】:我正在尝试为日程安排应用执行日期计算,但遇到了夏令时问题。我正在尝试确定两个日期之间的天数:
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 个日期。我不确定这是否是一个合法的问题......
创建不受 DST 影响的自定义时区。这甚至可能吗?
【问题讨论】:
只需将您的 NSCalendar 设置为 UTC。 我已将日历更改为 UTC,结果没有差异。我做对了吗?[self.calendar setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
我用NSLog(@"%@", [NSTimeZone knownTimeZoneNames]);
列出了时区,并在“美国/某某”和“欧洲/某某”甚至格林威治标准时间之类的地方列出了一长串,但我没有看到UTC。不是一直可用吗?
使用 GMT,它是 UTC 的旧名称。我很惊讶 Apple 没有添加 UTC。
或者直接使用[NSTimeZone timeZoneForSecondsFromGMT:0]
【参考方案1】:
我可以使用 10 月 27 日左右的日期(英国夏令时开始时)并将时区设置为欧洲/伦敦来确认您的观察。 “n 天 24 小时”似乎是个怪癖(对 bug 的好话,有人忘了携带)。
解决方案 1:使用设置为 UTC 的 NSCalendar
。 UTC 没有夏令时。
解决方案 2:由于您的所有时间都在午夜,并且最大夏令时班次为 1 小时,因此“一天”介于 23 到 25 小时之间。考虑到这一点,并同时简单地处理怪癖:
daysBetween = [activityComponents day] + ([activityComponents hour] >= 23 ? 1 : 0);
请注意,这只有有效,因为两个日期的时间相同!
【讨论】:
成功了;我使用[self.calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
将NSCalendar
设置为UTC 我没有让UTC 更早地工作,因为我在初始化日历之前错误地尝试设置时区。一旦我将它移到 alloc,init 位之后,它就可以正常工作了。感谢大家的帮助!以上是关于没有夏令时的日期计算的主要内容,如果未能解决你的问题,请参考以下文章