【发布时间】:2019-05-12 19:05:28
【问题描述】:
我正在 Swift 中基于 OpenWeatherMap API 创建一个天气应用程序。
我通过 Unix Timestamp 作为 Int 接收本地时间,我想将其转换为人类可读的格式。
我可以将当前(设备)时间转换为可读格式,但不能转换为 int 值。
【问题讨论】:
标签: json swift unix-timestamp epoch
我正在 Swift 中基于 OpenWeatherMap API 创建一个天气应用程序。
我通过 Unix Timestamp 作为 Int 接收本地时间,我想将其转换为人类可读的格式。
我可以将当前(设备)时间转换为可读格式,但不能转换为 int 值。
【问题讨论】:
标签: json swift unix-timestamp epoch
当您使用Codable 时,这很容易
将所有与日期相关的结构成员(dt、sunrise、sunset)声明为Date
let dt : Date
给解码器添加合适的日期解码策略
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
例如,使用DateFormatter 获取人类可读的字符串
let formatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("yyyyMMMddHHmmss")
let dateString = formatter.string(from: dt)
【讨论】:
Cannot convert value of type '(UnsafeMutablePointer<time_t>?) -> time_t' (aka '(Optional<UnsafeMutablePointer<Int>>) -> Int') to expected argument type 'Date'
OpenWeatherMap。将 UNIX 时间戳解码为 Date 应该可以工作。并且始终发送dt。不要将其声明为可选。
struct MyLocalTime: Decodable { let currently: Currently } struct Currently: Decodable { let time: Date } 这是结构体的代码。
DarkSky。我的建议只对 OWM 有效。
Unix 时间戳通常是自 1970 年 1 月 1 日午夜以来的秒数或毫秒数。
将 Cocoa Date 转换为 Unix 毫秒非常容易:
let unixMilliseconds: Int = Int(Date().timeIntervalSince1970 * 1000)
print(unixMilliseconds)
或者,如果您有 Unix 时间戳:
let date = Date.init(timeIntervalSince1970: Double(unixMilliseconds/1000))
print(DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .medium))
(如果您要处理秒数,您可以在上面的代码中使用 *1000 和 /1000。或者使用 vadian 的优秀答案中描述的 JSON 解码器。)
【讨论】: