我注意到,在将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纳秒成为平等的截止的合理原因?
答案 0 :(得分:9)
日期在内部表示为Double
。 Double
的精确度有限。您的第一个日期的内部值为504950400.000000000000000
(以小数点后15位打印时)。下一个更高的可表示值是504950400.000000059604645
。如果您将纳秒设置为30
,则结束日期恰好是504950400.000000059604645
(实际上对应于纳秒值59
)。
也就是说,2017年1月,Date
只能区分59纳秒的间隔。与此同时,在2001年1月,Date
可以区分每一纳秒。在2027年,它将区分119纳秒的间隔。