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

func timeIntervalSinceDate(anotherDate: NSDate) -> NSTimeInterval

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



哪个功能更精确?哪些功能考虑了夏令时,leap秒等?

例如:
    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可能是更精确的,因为它是一个double,但是它是否考虑了DST,leap秒等?

最佳答案

它不是一个更准确/准确的方法。他们做不同的事情。
timeIntervalSinceDate方法为您提供了两个日期之间的秒数差的原始计算,而无需尝试将其分为分钟和秒之类的常规单位。我想timeIntervalSinceDate会更精确,因为它可以在不到几秒的时间内为您提供答案,且精度为亚毫秒。
您的第二个版本使用日历对象来计算两个日期之间的整数秒数。该版本可用于计算两个日期之间的年,月,周,天等的数量,并且对于“日历计算”非常有用。显然,在您的示例中,您仅要求整秒差的数量。
正如Martin R在下面的评论中指出的那样,您可以稍微调整日历代码,并使用CalendarUnitNanosecond从NSCalendar获得非常精确的分数秒。
编辑:
自OS X / iOS的“新纪元”以来,NSDates实际上只是围绕秒数计数的一个薄包装。 timeIntervalSinceDate方法将实现闪电般的速度,因为它只是在做简单的浮点减法。
相比之下,使用NSCalendar和NSDateComponents的代码可能非常复杂,因此执行起来较慢。这种计算必须考虑到不同的日历系统,每月不同的天数,leap年以及许多其他极端情况。

10-07 12:46