格式化时间戳后返回错误的值

时间:2016-02-24 01:01:35

标签: swift datetime unix-timestamp

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

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)。

2 个答案:

答案 0 :(得分: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游乐场中,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"

当然,请注意您从第一个代码段获得的完全时间间隔(1456031580号码)以及您获得的完全字符串< em> 特定号码将取决于您的时区。

enter image description here

一旦你链接到Epoch Converter,我就把你原来的价值粘贴在这里,确实得到了二月的正确值 - 是的。但是注意粗体文字很重要。

  

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

该网站认为该号码将为您提供46,000年的日期,并且猜测您实际上已经给出了毫秒数,因此它会根据该假设进行计算。

NSDate&#39; timeIntervalSince1970构造函数采用NSTimeInterval类型的参数,该参数始终是的度量,而不是毫秒。您需要将原始值除以1000以获得秒数,或者编写一个NSDate构造函数,该构造函数需要使用自1970年以来的毫秒数而不是秒数来初始化,因为您使用的初始化程序需要

答案 1 :(得分:1)

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