将12位数刻度线转换为日期

时间:2018-12-20 12:36:03

标签: ios swift date nsdateformatter

我正在尝试转换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?

2 个答案:

答案 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小时。