没有夏令时的日期计算

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.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 影响的自定义时区。这甚至可能吗?

【问题讨论】:

只需将您的 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 位之后,它就可以正常工作了。感谢大家的帮助!

以上是关于没有夏令时的日期计算的主要内容,如果未能解决你的问题,请参考以下文章

计算Java中的日期差异

Calendar日期类详解SimpleDateFormat时区Date夏令时常用方法,日期差获取当前时间

用Java计算两个日期之间的天数

在 Javascript 中使用夏令时检查日期范围

在 SQL/数据库级别计算夏令时 (DST)

用于查找下一个欧洲夏令时日期的 SQL Server