我正在尝试格式化时间戳,但返回了错误的值。
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)。
答案 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> 特定号码将取决于您的时区。
一旦你链接到Epoch Converter,我就把你原来的价值粘贴在这里,确实得到了二月的正确值 - 是的。但是注意粗体文字很重要。
假设此时间戳以毫秒为单位:
该网站认为该号码将为您提供46,000年的日期,并且猜测您实际上已经给出了毫秒数,因此它会根据该假设进行计算。
NSDate
&#39; timeIntervalSince1970
构造函数采用NSTimeInterval
类型的参数,该参数始终是秒的度量,而不是毫秒。您需要将原始值除以1000以获得秒数,或者编写一个NSDate
构造函数,该构造函数需要使用自1970年以来的毫秒数而不是秒数来初始化,因为您使用的初始化程序需要
答案 1 :(得分:1)
您必须将timestampDouble除以1000,因为NSTimeInterval以秒为单位,您以毫秒为单位给出它。