【问题标题】:epoch convert json int (unix timestamp) into readable date in swift纪元将json int(unix时间戳)快速转换为可读日期
【发布时间】:2019-05-12 19:05:28
【问题描述】:

我正在 Swift 中基于 OpenWeatherMap API 创建一个天气应用程序。

我通过 Unix Timestamp 作为 Int 接收本地时间,我想将其转换为人类可读的格式。

我可以将当​​前(设备)时间转换为可读格式,但不能转换为 int 值。

【问题讨论】:

    标签: json swift unix-timestamp epoch


    【解决方案1】:

    当您使用Codable 时,这很容易

    • 将所有与日期相关的结构成员(dtsunrisesunset)声明为Date

      let dt : Date
      
    • 给解码器添加合适的日期解码策略

      let decoder = JSONDecoder()
      decoder.dateDecodingStrategy = .secondsSince1970
      
    • 例如,使用DateFormatter 获取人类可读的字符串

      let formatter = DateFormatter()
      formatter.setLocalizedDateFormatFromTemplate("yyyyMMMddHHmmss")
      let dateString = formatter.string(from: dt)
      

    【讨论】:

    • 感谢您的回答。我在 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。不要将其声明为可选。
    • 我没有在当地时间使用 OpenWeatherMap。我使用 OWM 来显示温度、天气和城市名称。通过相同的 API,我还收集了用于创建指向同一城市的 DarkSky 链接的坐标(OWM 使用城市名称,DarkSky 使用坐标)来收集当地时间。 struct MyLocalTime: Decodable { let currently: Currently } struct Currently: Decodable { let time: Date } 这是结构体的代码。
    • 我不知道DarkSky。我的建议只对 OWM 有效。
    【解决方案2】:

    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 解码器。)

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2013-01-08
      • 1970-01-01
      • 2014-01-25
      • 2012-11-12
      • 2021-02-19
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多