DateFormatter对某些字符串返回nil



我正在将JSON文件中的日期字符串转换为date格式,大多数时候它都能工作,但这个例子失败了,我不知道为什么。任何想法都值得赞赏!非常感谢。

let input = "2015-06-20T00:47:00.484Z"

let dateFormatter = DateFormatter()
dateFormatter.calendar = Calendar(identifier: .iso8601)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.sssZ"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")

print("ConvertedOutput: (dateFormatter.date(from: input))")

您的输入是一个符合ISO8601标准的日期字符串。对于此类日期字符串,Foundation有一个ISO8601DateFormatter类,它可以帮助您避免许多可能导致错误日期解析的边缘情况,这就是为什么苹果建议对此类日期字符串使用此专用类,而不是使用DateFormatter。

使用ISO8601DateFormatter的代码

let dateFormatterIso = ISO8601DateFormatter()
dateFormatterIso.formatOptions = [.withFullDate, .withFullTime, .withFractionalSeconds]
let inputDate = dateFormatterIso.date(from: input)

使用DateFormatter的代码

如果您不能使用ISO8601DateFormatter,那么你必须纠正分数秒掩码错误的日期格式:.SSS改为.SSS

let dateFormatter = DateFormatter()
dateFormatter.calendar = Calendar(identifier: .iso8601)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")

两个格式化程序都返回:

▿ Optional<Date>
▿ some : 2015-06-20 00:47:00 +0000
- timeIntervalSinceReferenceDate : 456454020.48399997

对于毫秒,您应该使用SSS而不是像这样的sss-

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"