使用timeIntervalSince1970时日期不相等

时间:2019-03-22 06:25:07

标签: swift date comparison

我刚刚在下面运行了几次代码,发现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?

1 个答案:

答案 0 :(得分:1)

问题是使用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.swiftstruct 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
    }
}