【问题标题】:Wrong value returned after formatting timestamp格式化时间戳后返回错误值
【发布时间】:2016-02-24 01:01:35
【问题描述】:

我正在尝试格式化时间戳,但返回了错误的值。

let timestampDouble: Double = 1455970380471
let timestamp = NSDate(timeIntervalSince1970: timestampDouble)
let formattedTimestamp = NSDateFormatter.localizedStringFromDate(timestamp, dateStyle: .MediumStyle, timeStyle: .ShortStyle)

formattedTimestamp 返回Jun 22, 48115, 8:49 AM,而不是Feb 20, 2016, 11:13 PM 的正确时间戳(来自epochconverter.com)。

【问题讨论】:

标签: swift datetime unix-timestamp


【解决方案1】:

您必须将 timestampDouble 除以 1000,因为 NSTimeInterval 以秒为单位,而您以毫秒为单位。

【讨论】:

    【解决方案2】:

    你的值有误。

    我颠倒了这个过程,从你想要的日期字符串开始,并通过这段代码运行它:

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = .MediumStyle
    dateFormatter.timeStyle = .ShortStyle
    let date = dateFormatter.dateFromString("Feb 20, 2016, 11:13 PM")
    let timeInterval = date?.timeIntervalSince1970
    

    在 Swift Playground 中,timeInterval 的值为 1456031580,比您使用的值短三个数字

    当我回到你的原始代码并使用这个新值时:

    let timestampDouble: Double = 1456031580
    let timestamp = NSDate(timeIntervalSince1970: timestampDouble)
    let formattedTimestamp = NSDateFormatter.localizedStringFromDate(timestamp, dateStyle: .MediumStyle, timeStyle: .ShortStyle)
    

    我们得到期望值:"Feb 20, 2016, 11:13 PM"

    当然,请注意您从第一个 sn-p 获得的 exact 时间间隔(1456031580 数字)和您为 exact 得到的字符串em>那个具体数字取决于你的时区。


    一旦你链接到Epoch Converter,我将你的原始值粘贴到这里,确实得到了二月的正确值。但请务必注意粗体字。

    假设这个时间戳以毫秒为单位:

    网站看到这个数字会给你一个未来 46,000 年的日期,猜测你实际上给了它毫秒,所以它会根据这个假设进行计算。

    NSDatetimeIntervalSince1970 构造函数采用NSTimeInterval 类型的参数,它始终是 的度量,而不是毫秒。您需要将原始值除以 1000 以获得秒数,或者编写一个 NSDate 构造函数,该构造函数期望使用自 1970 年以来的毫秒数而不是秒数进行初始化,正如您使用的初始化程序所期望的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多