快速日期等于30纳秒

时间:2017-09-11 18:05:45

标签: ios swift cocoa nsdate

我注意到,在将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比较,行为是相同的。我在文档或标题中找不到任何相关内容。是否存在30纳秒成为平等的截止的合理原因?

1 个答案:

答案 0 :(得分:9)

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

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