![](/img/trans.png)
[英]iOS 10 timezone format trouble with dates created as timeIntervalSince1970
[英]Dates are not equal while using timeIntervalSince1970
我刚刚运行了几次下面的代码,发现有时 date1 和 date2 相等,但有时不相等。
let date1 = Date()
let date2 = Date(timeIntervalSince1970: date1.timeIntervalSince1970)
print(date1)
print(date2)
print(date1.timeIntervalSince1970)
print(date2.timeIntervalSince1970)
print(date1 == date2)
所以有时我会得到:
2019-03-22 05:52:30 +0000
2019-03-22 05:52:30 +0000
1553233950.498001
1553233950.498001
false
这些日期看起来相同,但比较告诉我它们是不同的。 问题是 date2 与 date1 略有不同。 为了证明这一点,我可以写:
print(date1.timeIntervalSince(date2))
并得到:
-1.1920928955078125e-07
那么有什么方法可以将 date1 转换为数字,然后再返回到等于 date1 的 date2?
问题是timeIntervalSince1970
的使用。 如果您使用它, Date
实现将进行一些Double
计算以将其与参考日期 (2001-01-01) 对齐。
如果您改用timeIntervalSinceReferenceDate
,这将直接使用,您的代码应该可以工作:
for i in 1...200000 {
let date1 = Date()
let date2 = Date(timeIntervalSinceReferenceDate: date1.timeIntervalSinceReferenceDate)
if (date1 != date2) {
// never called on my machine:
let delta = date1.timeIntervalSince(date2)
print("\(i): \(delta)")
}
}
供您参考,这里是https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/Date.swift上struct Date
实现的有趣部分 - 您会看到在第一个init
完成的计算:
public struct Date : ReferenceConvertible, Comparable, Equatable {
fileprivate var _time: TimeInterval
public static let timeIntervalBetween1970AndReferenceDate: TimeInterval = 978307200.0
public init(timeIntervalSince1970: TimeInterval) {
self.init(timeIntervalSinceReferenceDate: timeIntervalSince1970 - Date.timeIntervalBetween1970AndReferenceDate)
}
public init(timeIntervalSinceReferenceDate ti: TimeInterval) {
_time = ti
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.