ISO8601 有几个不同的选项,包括时区。看来,默认情况下ISO8601DateFormatter
,字符串中需要一个时区指示符。您可以使用如下自定义选项禁用此行为:
let pulledDate = "2017-06-16T13:38:34.601767"
var dateFormatter = ISO8601DateFormatter()
dateFormatter.formatOptions = [.withYear, .withMonth, .withDay, .withTime, .withDashSeparatorInDate, .withColonSeparatorInTime]
let date = dateFormatter.date(from: pulledDate)
如果您想知道默认选项是什么,只需在 Playground 中运行以下代码:
let dateFormatter = ISO8601DateFormatter()
let options = dateFormatter.formatOptions
options.contains(.withYear)
options.contains(.withMonth)
options.contains(.withWeekOfYear)
options.contains(.withDay)
options.contains(.withTime)
options.contains(.withTimeZone)
options.contains(.withSpaceBetweenDateAndTime)
options.contains(.withDashSeparatorInDate)
options.contains(.withColonSeparatorInTime)
options.contains(.withColonSeparatorInTimeZone)
options.contains(.withFullDate)
options.contains(.withFullTime)
options.contains(.withInternetDateTime)
当然,如果您的字符串不包含时区,则日期格式化程序仍将使用其timeZone
属性在时区中解释它,根据文档,该属性默认为 GMT。
如果您想在不同的时区解释您的日期,请记住在使用格式化程序之前更改它:
dateFormatter.timeZone = TimeZone(identifier: "Europe/Paris")