日历:获取date组件,奇怪的情况
我试图找出为什么这段代码工作如此奇怪。 您可以在下面find详情:
let nowDate = Date() let threeDayBeforeNowDate_t1 = Date(timeIntervalSinceNow: -60 * 60 * 24 * 3) let oneDayAfterNowDate = Date(timeIntervalSinceNow: 60 * 60 * 24 * 1) let threeDayBeforeNowDate_t2 = Date(timeIntervalSinceNow: -60 * 60 * 24 * 3) let threeDayBeforeNowDate = nowDate.addingTimeInterval(-60 * 60 * 24 * 3) let diff_1 = threeDayBeforeNowDate_t1.timeIntervalSince(nowDate) - threeDayBeforeNowDate.timeIntervalSince(nowDate) // about 0.009357 let diff_2 = threeDayBeforeNowDate_t2.timeIntervalSince(nowDate) - threeDayBeforeNowDate.timeIntervalSince(nowDate) // about 0.010063 let diff_3 = threeDayBeforeNowDate_t2.timeIntervalSince(nowDate) - threeDayBeforeNowDate_t1.timeIntervalSince(nowDate) // about 0.000416 let calendar = Calendar.current calendar.dateComponents(Set([Calendar.Component.day]), from: threeDayBeforeNowDate, to: oneDayAfterNowDate) // result = "day: 4 isLeapMonth: false" calendar.dateComponents(Set([Calendar.Component.day]), from: threeDayBeforeNowDate_t1, to: oneDayAfterNowDate) // day: 4 isLeapMonth: false calendar.dateComponents(Set([Calendar.Component.day]), from: threeDayBeforeNowDate_t2, to: oneDayAfterNowDate) // day: 3 isLeapMonth: false
我不明白,为什么我得到如此不同的结果,而date(threeDayBeforeNow …)相差不到一秒钟。
正如Dávid已经解释的那样 ,问题在于各个date是在不同的时间点计算出来的,所以这个差别不是4天。 特别是, threeDayBeforeNowDate_t2
和oneDayAfterNowDate
之间的差异小于 4天,这就是为什么差异的.day
组件是3
。
下面是一个演示问题的简单例子(在Playground中):
let nowDate = Date() let date1 = Date(timeIntervalSinceNow: -60 * 60 * 24 * 4) let date2 = nowDate.addingTimeInterval(-60 * 60 * 24 * 4) let calendar = Calendar.current calendar.dateComponents([.day, .hour, .minute, .second, .nanosecond], from: date1, to: nowDate) // day: 3 hour: 23 minute: 59 second: 59 nanosecond: 994143066 isLeapMonth: false calendar.dateComponents([.day, .hour, .minute, .second, .nanosecond], from: date2, to: nowDate) // day: 4 hour: 0 minute: 0 second: 0 nanosecond: 0 isLeapMonth: false
date2
和nowDate
相差4天,但是date1
和nowDate
相差不到 4天(假设在此时间段内没有夏时制转换)。
问题是创buildnowDate
和其他variablesDate(timeIntervalSinceNow:)
使用Date(timeIntervalSinceNow:)
初始值设定项)之间需要一段时间。
Date()
和Date(timeIntervalSinceNow:)
使用系统时间来获取执行到达特定variables的当前时间。 不pipe有多小,在不同的调用系统时间之间总是会有一些小的延迟,因此即使你在两个连续的代码行中使用Date()
创build两个Date
对象,它们也不会代表完全相同的时间点。
在游乐场中运行,下面的一段代码显示了这种行为:
let now1 = Date() let now2 = Date() now1.timeIntervalSince(now2) //-0.0002049803733825684
如果您想要一致的Date
对象,请使用Date()
方法创build一个存储创buildDate()
variables,然后使用该variables创build其他Date
对象,方法是使用nowDate.addingTimeInterval()
正如你目前为threeDayBeforeNowDate
做的threeDayBeforeNowDate
。