我正在尝试转换12位C#日期时间刻度格式的时间。 (648000000000)。借助以下链接,我在代码How to get 18-digit current timestamp in Swift?中添加了扩展名。
extension Date {
init(ticks: UInt64) {
self.init(timeIntervalSince1970: Double(ticks)/10_000_000 - 62_135_596_800)
}
}
让日期=日期(滴答声:648000000000)
当我尝试查看结果日期时,它将打印以下内容;
0001-01-03 18:00:00 +0000
但是,当我尝试将其转换为小时和分钟时,格式输出与19:55无关
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
dateFormatter.string(from: date)
我的第一个问题是如何格式化它,使其仅获得18:00。其次是为什么只打印日期时打印18:00,而格式化日期时打印19:55?
答案 0 :(得分:2)
请不要减去62_135_596_800
extension Date {
init(ticks: UInt64) {
self.init(timeIntervalSince1970: Double(ticks)/10_000_000)
}
}
1970-01-01 18:00:00 +0000
另一个问题:创建date
并打印时,该字符串的格式为UTC时区(偏移量为GMT + 0)。但是DateFormatter
返回的字符串表示形式取决于其时区,时区默认为本地时区。
您只需将dateFormatter
的{{1}}设置为UTC即可修正代码
timeZone
18:00
答案 1 :(得分:2)
显然,您的时间戳表示持续时间,表示为100纳秒刻度,而不是日期。如果将数字除以10 ^ 7,则得到秒数。可以使用DateComponentsFormatter
将它们打印为持续时间。
示例:
let ticks = 648000000000
let seconds = TimeInterval(ticks) / 10_000_000
let fmt = DateComponentsFormatter()
fmt.allowedUnits = [.hour, .minute]
print(fmt.string(from: seconds)!)
18:00
持续时间为64800 = 18 * 60 * 60秒,即18小时。