使DateFormatter工作需要什么?

时间:2017-03-22 17:15:38

标签: swift nsdateformatter

我无法让日期格式化程序在给定字符串时输出日期。我正在使用的代码如下:

        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函数进行转换。

问题是,我错过了什么?

2 个答案:

答案 0 :(得分:1)

有几个问题:

  1. 请勿使用setLocalizedDateFormatFromTemplate。这是用于在UI中显示本地化日期字符串的方法。但是你需要一个文字日期字符串。请改用dateFormat

  2. 不要使用en_GB语言环境。使用en_US_POSIX。请参阅Apple Technical Q&A 1480

  3. 如果您要查找文字Z(用引号括起来),您还必须将格式化程序的timeZone设置为GMT / UTC / Zulu。或者,更好的是,只需使用不带引号的Z yyyy-MM-dd'T'HH:mm:ssZ,这将正确解释输入字符串中的Z作为GMT时间字符串的指示符。问题中写的代码不会正确调整时区。

  4. 因此:

    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"

它可以理解任何时区