代码之家  ›  专栏  ›  技术社区  ›  Jake2Finn

将日期格式iso-8601更改为自定义格式

  •  1
  • Jake2Finn  · 技术社区  · 7 年前

    我已经编写了以下代码,但是我得到了nil作为timestamp,而且我假设当timestamp是iso-8601格式时,“date”不是正确的类型:

    Swift.DecodingError.Context文件(codingPath:[\u JSONKey(stringValue:”索引 0“,intValue:0),编码键(stringValue:“timestamp”,intValue: nil)],debugDescription:“应解码Double,但发现

    雨燕4

    import UIKit
    
    enum Type : String, Codable {
        case organizational, planning
    }
    
    // structure from json file
    struct News: Codable{
        let type: Type
        let timestamp: Date //comes in json with ISO-8601-format
        let title: String
        let message: String
    
        enum  CodingKeys: String, CodingKey { case type, timestamp, title, message}
    
        let dateFormatter : DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "dd/MM/yy HH:mm:ss"  // change format ISO-8601 to dd/MM/yy HH:mm:ss
            return formatter
        }()
    
        var dateString : String {
            return dateFormatter.string(from:timestamp) // take timestamp variable of type date and make it a string -> lable.text
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   vadian    7 年前

    当你解码一个 Date Double

    不过,您确实可以将ISO8601字符串解码为 日期 如果你加上 decoder.dateDecodingStrategy = .iso8601 没有

    有两种选择:

    1. 添加 formatted dateDecodingStrategy 用一个 DateFormatter .

      let dateFormatter = DateFormatter()
      dateFormatter.locale = Locale(identifier: "en_US_POSIX")
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
      let decoder = JSONDecoder() 
      decoder.dateDecodingStrategy = .formatted(dateFormatter)
      try decoder.decode(...
      
    2. timestamp

      let timestamp: String
      

      并使用两个格式化程序或两个日期格式在中来回转换字符串 dateString .