除了功能的输入和输出之外,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
哪个更准确/更正,seconds
或anotherSeconds
?
注意:seconds
似乎更准确,因为它是双倍的,但它是否考虑了DST,闰秒等?
答案 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也负责时区。