我无法让日期格式化程序在给定字符串时输出日期。我正在使用的代码如下:
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_GB")
formatter.setLocalizedDateFormatFromTemplate("yyyy-MM-dd'T'HH:mm:ss'Z'")
if let date = formatter.date(from: string){
return date
}else{
print("Fail: " + string)
print("Form: yyyy-MM-dd'T'HH:mm:ss'Z'")
return Date(timeIntervalSince1970: TimeInterval(0))
}
我使用的日期是" 2017-03-22T17:09:16Z"。但是,结果总是以nil(运行故障循环)返回。我已经尝试了DateFormatter文档中的两个版本(这个和#34;使用固定格式日期表示和#34;部分)。
此字符串应该有效,但不起作用。该字符串源自ascii格式的字节数组,使用String中相应的init函数进行转换。
问题是,我错过了什么?
答案 0 :(得分:1)
有几个问题:
请勿使用setLocalizedDateFormatFromTemplate
。这是用于在UI中显示本地化日期字符串的方法。但是你需要一个文字日期字符串。请改用dateFormat
。
不要使用en_GB
语言环境。使用en_US_POSIX
。请参阅Apple Technical Q&A 1480。
如果您要查找文字Z
(用引号括起来),您还必须将格式化程序的timeZone
设置为GMT / UTC / Zulu。或者,更好的是,只需使用不带引号的Z
yyyy-MM-dd'T'HH:mm:ssZ
,这将正确解释输入字符串中的Z
作为GMT时间字符串的指示符。问题中写的代码不会正确调整时区。
因此:
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
if let date = formatter.date(from: string) {
return date
} else {
...
}
顺便说一下,在iOS 10和macOS 10.12中引入的ISO8601DateFormatter
让你摆脱了关于语言环境,时区和格式字符串的烦恼。它为您解析ISO 8601 / RFC 3339日期格式:
let formatter = ISO8601DateFormatter()
if let date = formatter.date(from: string) {
return date
} else {
...
}
答案 1 :(得分:0)
您正在使用DateFormatter的错误功能。
它应该是dateFormat
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
你也应删除Z之间的'
。由于"2017-03-22T17:09:16Z"
适用于硬编码的'Z'
,但不适用于"2017-03-22T17:09:16+02:00"
。
但是如果你设置:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
它可以理解任何时区