日期字符串与格式化程序期望的格式不匹配

Swi*_*ODA 6 json date swift dateformatter jsondecoder

只能在朋友的设备上重现此问题。该设备来自德国,并在“设置”中设置为德国地区。我无法在任何加拿大设备上复制。为什么尝试从 JSON 创建日期属性时失败?

安慰:

dataCorrupted(Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "60", intValue: nil), CodingKeys(stringValue: "expiration", intValue: nil)], debugDescription: "日期字符串与格式化程序期望的格式不匹配.",底层错误:nil))

结构:

struct TokenResponse: Decodable {
    var ticket : String
    var expiration : Date?
    var sessionId: String
}
Run Code Online (Sandbox Code Playgroud)

URLSession 内部:

do {
    let decoder = JSONDecoder()
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    decoder.dateDecodingStrategy = .formatted(formatter)
    let json = try decoder.decode([String: TokenResponse].self, from: data)
}
catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

JSON:

{
   "60":{
      "ticket":"aVeryLongJWT",
      "expiration":"2022-02-04T22:00:34.8325102Z",
      "sessionId":"aUUID"
   }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 10

locale您应该在设置字符串之前设置dateFormat

\n
let formatter = DateFormatter()\nformatter.locale = Locale(identifier: "en_US_POSIX")\nformatter.dateFormat = "yyyy-MM-dd\'T\'HH:mm:ss.SSSZ"\n
Run Code Online (Sandbox Code Playgroud)\n

DateFormatter 请参阅文档中的\xe2\x80\x9c使用固定格式日期表示\xe2\x80\x9d 。

\n