Swift 日期等同于 30 纳秒以下

Swift dates are equivalent under 30 nanoseconds

我注意到在比较 Swift Date== 的两个实例时,当 DateComponents.nanoseconds 的差异小于 30 时,它们符合同一日期. 例如:

let calendar = Calendar(identifier: .gregorian)
let startComps = DateComponents(year: 2017, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)
let endComps = DateComponents(year: 2017, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 29)

let startDate = calendar.date(from: startComps)!
let endDate = calendar.date(from: endComps)!
print(startDate == endDate)
//prints true, changing 29 to 30 prints false

startDate.compare(endDate) == .orderedSame 相比,行为相同。我在文档或 headers 中找不到对此的任何提及。是否有合乎逻辑的理由将 30 纳秒作为平等的截止点?

日期在内部表示为 DoubleDoubles 的精度有限。您在那里的第一个约会的内部值为 504950400.000000000000000(以小数点后 15 位打印)。下一个更高的可表示值是 504950400.000000059604645。如果您将纳秒设置为 30,您的结束日期恰好是 504950400.000000059604645(实际上对应于 59 的纳秒值)。

也就是说,在2017年1月,Date只能区分59纳秒的间隔。同时回到 2001 年 1 月,Date 可以区分每一纳秒。并在 2027 年区分 119 纳秒间隔。