将 ISO 8601 字符串转换为格式化日期字符串 (Swift)

convert ISO8601 String to reformatted date string(Swift)

我正在从 JSON 数据库中提取日期。日期的格式类似于 2017-06-16T13:38:34.601767(我认为是 ISO8601)。我正在尝试使用 ISO8601DateFormatter 将日期格式化为 2017-06-16T13:38:34.601767 到 2017-06-16。到目前为止,我什至无法将拉出的字符串格式化为日期。

let pulledDate = self.pulledRequest.date
var dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from: pulledDate)
print(date!) //nil

我不确定我的日期格式是否有误,它不是 ISO8601,或者我是否没有按预期使用 ISO8601DateFormatter。

1.) 是 ISO8601 日期吗?
2.) 我是否正确使用了 ISO8601DateFormatter?

谢谢!

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 属性 在时区中解释它,根据文档,默认为格林威治标准时间

如果您想在不同的时区解释您的日期,请记住在使用格式化程序之前更改它:

dateFormatter.timeZone = TimeZone(identifier: "Europe/Paris")