1

我有一个使用 JSONDecoder() 解析的 json 文件。但是,我收到了日期类型为 iso-8601 格式的变量时间戳(“yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX”),但在我看来,我想以自定义格式显示它: “dd/mm/yy HH:mm:ss”。

我已经编写了以下代码,但时间戳为零,此外,我假设“日期”不是在时间戳采用 iso-8601 格式时使用的正确类型:

错误 json: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "timestamp", intValue: nil)], debugDescription: "Expected解码 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
    }
}
4

1 回答 1

3

当您解码 a 时Date,解码器默认需要 UNIX 时间戳 (a Double),这就是错误消息告诉您的内容。

但是,您确实可以像Date添加一样解码 ISO8601 字符串,decoder.dateDecodingStrategy = .iso8601但这仅解码标准 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

于 2018-09-01T14:30:06.860 回答