NSDate 的 timeIntervalSinceDate(_:) 和 NSCalendar 的 components(_:fromDate:toDate:options:) 的区别

Difference of NSDate's timeIntervalSinceDate(_:) and NSCalendar's components(_:fromDate:toDate:options:)

除了函数的输入和输出,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

accurate/correct、secondsanotherSeconds 哪个更大?

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

不是一个多accurate/precise。他们做不同的事情。

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

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

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

编辑:

NSDates 实际上只是对自 OS X/iOS“纪元日期”以来的秒数计数的薄包装。 timeIntervalSinceDate 方法将快如闪电,因为它只是执行简单的浮点减法。

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

NSDate 只计算连续的秒数。

NSCalendar 和 NSDataComponents 处理实际的日历。比如可以用它们加"one month",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 也负责时区。