我从Web服务获取以下格式的日期时间字符串:
2014-08-22T15:00:00-04:00
最初,我手动剥离了碎片并将其重建为NSDate变量。我遇到的问题是当我检索日期的一部分时,00到04的小时会给我前一天。即使将本地时区应用于日期格式化程序,新日期的打印值也以+0000结束,这是不对的。
无论如何,我随后在Ojbective-C的苹果网站上找到了一些代码并将其翻译成Swift:
func userVisibleDateTimeStringForRFC3339DateTimeString(rfc3339DateTimeString: String) -> NSDate {
let rfc3339DateFormatter = NSDateFormatter()
let enUSPOSIXLocale = NSLocale(localeIdentifier: "en_US_POSIX")
rfc3339DateFormatter.locale = enUSPOSIXLocale
rfc3339DateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
let date = rfc3339DateFormatter.dateFromString(rfc3339DateTimeString)
return date!
}
(原始代码生成一个"用户可读日期字符串。"我只需要日期。
现在,它在return语句中崩溃,因为date为nil,这意味着它没有解析该datetime字符串。
我甚至只是尝试过:
let format="yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
var dateFmt = NSDateFormatter()
dateFmt.dateFormat = format
println(noaaDate)
let newreadableDate = dateFmt.dateFromString(noaaDate)
println(newreadableDate)
newreadableDate是nil
我需要的只是将该字符串转换为一个日期,以便我稍后进行适当的日期组件比较。
答案 0 :(得分:2)
不要转义格式化字符,“Z”不得转义,它是格式化语法字符。只有'T'必须被转义,因为它是一个语法字符,不应该被解释为一个。 ' - '和'='不是语法字符,因此它们不需要转义,但可以。
从文档:“从a到z和从A到Z的ASCII字母保留为语法字符” 因此,任何字符a-zA-Z都被视为语法字符,除非它们被转义。
让格式=“yyyy-MM-dd'T'HH:mm:ssZ”
请参阅:ICU Formatting Dates and Times
let noaaDate = "2014-08-22T15:00:00-04:00"
let format="yyyy-MM-dd'T'HH:mm:ssZ"
var dateFmt = NSDateFormatter()
dateFmt.dateFormat = format
let newreadableDate = dateFmt.dateFromString(noaaDate)
println(newreadableDate)
输出:
可选(2014-08-22 19:00:00 +0000)