【问题标题】:Converting 12 digit ticks to Date将 12 位刻度转换为日期
【发布时间】:2019-05-20 23:39:03
【问题描述】:

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

【问题讨论】:

  • 该方法预计 “自 0001-01-01 以来的时间以 100 纳秒为间隔测量” - 这将是一个更大的数字(大约 18 位数字)。您的时间戳来自哪里,它代表什么日期?
  • 那个时间戳来自我们的服务器,我需要以某种方式转换它,实际上我只需要时钟(18:00)日期对于我们的案例并不重要。 @MartinR
  • 我真的怀疑它是19:55,因为您的问题是print(date) 显示您在UTC/+0 时区的时间并且日期格式化程序正在使用您当前的本地区域。最小时区偏移是 1/4 小时的乘数,而不是 5 分钟。
  • 添加:dateFormatter.timeZone = TimeZone(缩写:"UTC")
  • 你至少应该有一个时间戳的例子,它代表什么日期,服务器使用什么时区。否则纯属猜测。一旦你知道了这些事情,我想你可以自己弄清楚,因为网上有很多例子。

标签: ios swift date nsdateformatter


【解决方案1】:

只是不要减去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 返回的字符串表示取决于其时区,默认为本地时区。

您只需将 dateFormattertimeZone 设置为 UTC 即可修复您的代码

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

18:00

【讨论】:

  • 最后一句话有点奇怪。 Date 始终独立于时区。只有日期的字符串表示取决于时区。
  • @Sulthan 所以用 init 创建的 dateDateFormatter 返回给我的字符串表示形式不同?
  • 当我尝试你的代码时,它返回 03:00 但应该是 18:00 有什么区别?
  • 我也试过了,但它没有给我任何有效时间,只有一个日期和 00:00 时间
  • @Sulthan,是的,问题是什么:print(date) 显示18:00:00 +0000,而用DateFormatter 格式化的字符串显示不同的时间,作者想知道为什么。他询问字符串表示,以及它们为什么不同。他如何转换时间戳在这里几乎无关紧要。
【解决方案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 小时。

【讨论】:

  • 我也赞成你的回答,非常感谢你的解释,但第一个答案写在你面前,这就是我接受第一个答案的原因。
  • @AtalayAsa 这完全取决于您选择哪个答案被接受。 ;) 如果愿意,请选择 Martin 的(他解释得比我好)。
  • 是的,我知道,但我总是更喜欢选择正确的第一个书面答案,再次感谢你们两个 :) @RobertDresler
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2016-06-01
相关资源
最近更新 更多