objective-c - 没有夏令时的日期计算

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

最佳答案

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

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

解决方案 2:由于您的所有时间都是午夜,并且最大夏令时类次为 1 小时,因此“一天”介于 23 到 25 小时之间。为了允许这一点,并同时简单地处理怪癖:

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

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

关于objective-c - 没有夏令时的日期计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20183175/

相关文章:

objective-c - NSDate 将秒数归零而不四舍五入

objective-c - swift 错误 : Cannot convert value of type '() throws -> ()' to specified type 'Bool'

objective-c - Objective-C 如何制作一个从两分钟开始倒计时的计时器?

cocoa - 我想构建一个 OSX 应用程序,将一些简单的 DSP 应用于所有音频。我从哪里开始?

swift - 两个日期之间的天数并存储在变量中

iphone - 如何将 unix 时间戳转换为人类可读时间?

objective-c - Class 是对象还是结构体?

ios - SpriteKit 中的简单销接头无法按预期工作

objective-c - 初始化实例变量

arrays - Swift - 访问 nil 不会崩溃