这是我解决问题的尝试(见下文我如何计算幻数):
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 时间 (timeIntervalSince1970) 采用 UTC,如果它位于不同的时区,您需要将 TDateTime 值转换为 UTC。
例子:
//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)
以下是我使用 Swift 计算幻数 2209161600.0 的方法:
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 对及其 double 值进行一些单元测试肯定会有所帮助。