簡體   English   中英

使用 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.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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM