快速JSON日期

快速JSON日期,json,swift,Json,Swift,处理和格式化从同一JSON对象返回的不同日期字符串的最有效方法是什么。我使用的API根据位置返回2021-02-08T21:00-08:00或2021-02-09T06:00+01:00等。API还包括一个时区字符串,可能很方便-Europe/London 注意到API之前的代码包含不同的字符串 func时间格式(日期:字符串)->String{ let formatter=DateFormatter() formatter.dateFormat=“yyyy-MM-dd'T'HH:MM-ss:S

处理和格式化从同一JSON对象返回的不同日期字符串的最有效方法是什么。我使用的API根据位置返回
2021-02-08T21:00-08:00
2021-02-09T06:00+01:00
等。API还包括一个时区字符串,可能很方便-
Europe/London

注意到API之前的代码包含不同的字符串

func时间格式(日期:字符串)->String{
let formatter=DateFormatter()
formatter.dateFormat=“yyyy-MM-dd'T'HH:MM-ss:SSS”
///formatter.dateFormat=“yyyy-MM-dd'T'HH:MM+ss:SSS”
让formattedDate=formatter.date(从:日期)??日期()
formatter.dateFormat=“h a”
返回formatter.string(from:formattedDate)
}
更新

正如@gcharita和@JoakimDanielson指出的,我的字符串是相同的,但我不小心格式化了它。现在它工作得很好。我犯了错误,并为此承担全部责任

func时间格式(日期:字符串)->String{
let formatter=DateFormatter()
formatter.dateFormat=“yyyy-MM-dd'T'HH:mmZZZZZ”
让formattedDate=formatter.date(从:日期)??日期()
formatter.dateFormat=“h a”
返回formatter.string(from:formattedDate)
}

示例日期的
-08:00
+01:00
不是您在日期格式中指定的秒和毫秒。(
“yyyy-MM-dd'T'HH:MM-ss:SSS”
“yyy-MM-dd'T'HH:MM+ss:SSS”
)这是ISO 8601时区格式


正如@JoakimDanielson在评论中提到的,这两个日期的格式显然是相同的:
yyyy-MM-dd'HH:mmZZZZZ

,因为您只需要处理一种日期格式(如之前的海报所述)您应该将此问题留给
JSONDecoder
,只需像这样定义
dateDecodingStrategy

let decoder = JSONDecoder()
let dateFormatter = DateFormatter()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mmZZZZZ"
decoder.dateDecodingStrategy = .formatted(dateFormatter)

现在,您的
解码器将愉快地转换与给定格式匹配的所有日期。比自己处理所有杂乱的格式容易得多。

我已经尝试过使用ISO8601DateFormatter,这不是API返回的格式。我的链接问题的要点是使用Codable和decoder.DateDecoding策略,但我想这还不是很清楚。很抱歉此外,我看不出两个样本日期之间的差异。我看到了不同的值,但没有看到不同的格式。
-ss:SSS
这部分是错误的,因为我看不到什么应该与示例字符串中的
ss
匹配。你不明白
-08:00
意味着从格林尼治标准时间减去8小时。@JoakimDanielson感谢你的澄清,这毕竟是问题所在。我用现在有效的方法更新了我的原始答案。谢谢你的澄清,确实是我的时间字符串格式不正确。我使用了
“yyyy-MM-dd'T'HH:mmZZZZZ”
,现在它工作正常。我试图使用ISO8601DateFormatter(),但需要几个小时。