【问题标题】:Difference of NSDate's timeIntervalSinceDate(_:) and NSCalendar's components(_:fromDate:toDate:options:)NSDate 的 timeIntervalSinceDate(_:) 和 NSCalendar 的组件的区别(_:fromDate:toDate:options:)
【发布时间】:2015-05-13 18:51:47
【问题描述】:

除了函数的输入和输出,NSDate的有什么区别

func timeIntervalSinceDate(anotherDate: NSDate) -> NSTimeInterval

NSCalendar

func components(unitFlags: NSCalendarUnit, fromDate startingDate: NSDate, toDate resultDate: NSDate, options opts: NSCalendarOptions) -> NSDateComponents

?

哪个函数更精确?哪些函数会考虑夏令时、闰秒等?

例如:

    let today = NSDate()
    let someDate = RandomFutureDate() // Assumes this gives random future date

    let seconds = futureDate.timeIntervalSinceDate(today)
    let anotherSeconds = NSCalendar.currentCalendar().components(.CalendarUnitSecond, fromDate: today, toDate: futureDate, options: nil).second

secondsanotherSeconds 哪个更准确/正确?

注意:seconds 可能看起来更准确,因为它是双精度数,但它是否考虑了 DST、闰秒等?

【问题讨论】:

    标签: ios swift nsdate nscalendar nstimeinterval


    【解决方案1】:

    并不是一个更准确/精确。他们做不同的事情。

    timeIntervalSinceDate 方法为您提供 2 个日期之间的秒数差异的原始计算,而无需尝试将该差异划分为分钟和秒等常规单位。我猜 timeIntervalSinceDate 更精确,因为它会在小数秒内为您提供答案,精度为亚毫秒。

    您的第二个版本使用日历对象来计算两个日期之间的整数秒数。该版本可用于计算两个日期之间的年数、月数、周数、天数等​​,并且对于“日历计算”非常有用 显然在您的示例中,您只要求整数秒数的差异.

    正如 Martin R 在下面的评论中指出的那样,您可以稍微调整日历代码,并使用 CalendarUnitNanosecond 从 NSCalendar 获得非常精确的小数秒。

    编辑:

    NSDates 实际上只是对自 OS X/iOS“纪元日期”以来的秒数进行计数的薄包装。 timeIntervalSinceDate 方法会非常快,因为它只是做一个简单的浮点减法。

    相比之下,使用 NSCalendar 和 NSDateComponents 的代码可能相当复杂,因此执行起来会更慢。此类计算必须考虑到不同的日历系统、每个月不同的天数、闰年以及许多其他极端情况。

    【讨论】:

    • NSCalendar 不那么精确,可以使用CalendarUnitNanosecond 检索小数秒。示例:stackoverflow.com/questions/29791643/….
    • Martin,我正在回答 OPs 的具体问题,该问题仅使用秒单位。
    • 感谢您的详细解答。这是否意味着如果我通过使用 NSCalendar 在几年内获得秒数,它会计算闰秒,而 NSDate 不会?或者 NSDate 也会计算它,因为 OS X/iOS“纪元日期”会处理它?
    【解决方案2】:

    NSDate 只计算连续的秒数。

    NSCalendar 和 NSDataComponents 处理实际的日历。例如,您可以使用它们来添加“一个月”,将 3 月 1 日增加 31 天到 4 月 1 日,4 月 1 日增加 30 天到 5 月 1 日,2 月 1 日有时增加 28 天,有时增加 29 天到3 月 1 日。添加一天与添加 86400 秒不同,因为当夏令时更改时,添加一天将添加 23 小时或 25 小时。

    NSDate 也以 UTC 计算秒数。所以你不能用 NSDate 来回答两个日期是否是同一个日期——这取决于时区。相隔四个小时的两个日期可能在我居住的不同日子(晚上 10 点和凌晨 2 点)和您居住的同一天(凌晨 2 点和早上 6 点)。 NSCalendar 也处理时区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2011-11-01
      相关资源
      最近更新 更多