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

时间:2015-05-13 18:51:47

标签: ios swift nsdate nscalendar nstimeinterval

除了功能的输入和输出之外,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,闰秒等?

2 个答案:

答案 0 :(得分:1)

不是那个更准确/更准确。他们做不同的事情。

timeIntervalSinceDate方法为您提供原始计算2个日期之间的秒数差异,而不试图将该差异划分为传统单位,如分钟和秒。我猜timeIntervalSinceDate更精确,因为它以小秒为单位给出答案,精确度为亚毫秒。

您的第二个版本使用日历对象来计算两个日期之间的整数秒数。该版本可用于计算2个日期之间的年数,月数,周数,天数等,对于"日历计算非常有用"显然,在你的例子中,你只需要求整秒数的差异。

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

编辑:

NSDates实际上只是自OS X / iOS"纪元日期"以来秒数的一个薄包装器。 timeIntervalSinceDate方法将是闪电般快速的,因为它只是做一个简单的浮点减法。

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

答案 1 :(得分:1)

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也负责时区。