无法解析日期

时间:2014-08-25 14:04:16

标签: ios datetime swift

我从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

我需要的只是将该字符串转换为一个日期,以便我稍后进行适当的日期组件比较。

1 个答案:

答案 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)