DateFormatter ISO8601时区

时间:2018-03-14 20:50:48

标签: swift date

我试图添加解析验证测试,并希望检查我发送的初始JSON是否可以转换为对象,然后该对象又转换为JSON。最后验证是两个词典都是平等的。然而,我所看到的是,虽然日期解析有效,但转换为字符串会将+00:00替换为Z。在我的研究中,我发现这些是可以互换的,我知道理论上可以用Z代替+00:00进行比较,但我想知道是否有办法ISO8601DateFormatter或任何DateFormatter表示您希望+00:00超过Z

对于那些喜欢看一些代码的人来说,这是我的快速游乐场示例。

var date = "2018-01-30T22:13:12+00:00"
let df = ISO8601DateFormatter()
df.formatOptions = [.withInternetDateTime]

let newDate = df.date(from: date)
let newString = df.string(from: newDate!)

1 个答案:

答案 0 :(得分:0)

ISO 8601日期格式规定,当日期的时区偏移量为0时,应使用<outputFormat>markdown</outputFormat> 许多与Z一起使用的时区日期格式符号也会导致DateFormatter如果日期的时区偏移量为0。

如果您想从Z生成字符串,并且希望确保获得Date而不是+00:00,请使用Z和相应的日期格式化程序说明符。

格式说明符DateFormatter会以xxx格式为您提供时区。 +00:00XXX也会为您提供相同的格式,但如果偏移量为0,则会在结果中显示ZZZZZ。有关这些内容的更多信息,请参阅Unicode Technical Specification #35页面

Z及其ISO8601DateFormatter状态的文档formatOptions用于时区。因此,对于时区偏移量为0,您将始终获得ZZZZZ

日期格式为Z的{​​{1}}会为您提供所需的相同结果。但也要确保将日期格式化程序的语言环境设置为DateFormatter。您还需要确保输出在UTC时区中出现。将格式化程序的yyyy-MM-dd'T'HH:mm:ssxxx属性设置为en_US_POSIX