Вот моя попытка решить проблему (см. Ниже, как я вычислил магическое число c):
extension Date {
init(fromDelphiTDateTime delphiDate: Double) {
//Number of seconds between 12/30/1899 12:00 AM and 1/1/1970 12:00 AM
let tDateTimeUnixTimeOffset = 2209161600.0
//24 * 60 * 60
let numberOfSecondsInDay = 86400.0
let delphiTDateTimeAsUnixTime = delphiDate * numberOfSecondsInDay - tDateTimeUnixTimeOffset
self.init(timeIntervalSince1970: delphiTDateTimeAsUnixTime)
}
}
Я предположил, что TDateTime
не имеет никакой информации о часовом поясе. Поскольку Unix time (timeIntervalSince1970) указано в UT C, вам необходимо преобразовать значение TDateTime в UT C, если оно находится в другом часовом поясе.
Примеры:
//Dec 30, 1899 at 12:00 AM
let date1 = Date(fromDelphiTDateTime: 0)
//Jan 24, 2020 at 11:04 AM
let date2 = Date(fromDelphiTDateTime: 43854.4410269444)
И вот как я вычислил волшебный номер c 2209161600.0, используя Swift:
let zeroTDateTimeComponents = DateComponents(calendar: Calendar.init(identifier: .gregorian), timeZone: TimeZone(secondsFromGMT: 0), year: 1899, month: 12, day: 30, hour: 0, minute: 0, second: 0)
let zeroTDateTime = zeroTDateTimeComponents.date
let tDateTimeUnixTimeOffset = zeroTDateTime?.timeIntervalSince1970 //the value is 2209161600.0
Надеюсь, это поможет, и я был бы признателен, если сообщество подтвердит или улучшит мой ответ. Некоторые модульные тесты с существующими известными парами TDateTime и его двойным значением наверняка помогут.