Даты не равны при использовании timeIntervalSince1970 - PullRequest
1 голос
/ 22 марта 2019

Я просто запустил код ниже несколько раз и вижу, что иногда 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

Так что есть ли способ перевести дату1 в число, а затем обратно в дату2, которая равна дате1?

1 Ответ

1 голос
/ 22 марта 2019

Проблема заключается в использовании 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)")
    }
}

Для вашей информации, здесь интересные части реализации struct Date на https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/Date.swift - вы видите вычисления, выполненные в первом 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...