Swift 需要什么来让这个日期格式化程序工作?

Swift 需要什么来让这个日期格式化程序工作?,swift,nsdateformatter,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)

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

        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(运行fail循环)。我已经尝试了DateFormatter文档中的两个版本(本部分和“使用固定格式日期表示”部分)

此字符串应有效,但不起作用。该字符串源自ascii格式的字节数组,使用字符串中的相应init函数进行转换


问题是,我遗漏了什么?

您使用了错误的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"
它可以理解任何时区

以下几个问题:

  • 不要使用
    setLocalizedDataFormatFromTemplate
    。用于在UI中显示本地化的日期字符串。但是您需要一个文本日期字符串。改用
    dateFormat

  • 不要使用
    en_GB
    locale。使用
    en\u US\u POSIX
    。看看苹果

  • 如果要查找文字
    Z
    (用引号括起来),则必须将格式化程序的
    时区也设置为GMT/UTC/Zulu。或者,最好只使用不带引号的
    Z
    yyyy-MM-dd'T'HH:MM:ssZ
    ,这将正确地将输入字符串中的
    Z
    解释为GMT时间字符串的指示符。如问题中所述,该代码不会针对时区进行适当调整

  • 因此:


    顺便说一句,在iOS 10和macOS 10.12中引入的,可以让您摆脱对地区、时区和格式字符串的担忧。它为您解析ISO 8601/RFC 3339日期格式:

    let formatter = ISO8601DateFormatter()
    
    if let date = formatter.date(from: string) {
        return date
    } else {
        ...
    }
    

    同意Rob的回答并检查以下内容:查看不同的日期格式及其示例。与您的问题无关,但您真的想要
    Date(timeIntervalSince1970:TimeInterval(0))
    ?它将返回UTC时间午夜1970年1月1日的日期。它输出的日期只是一个占位符,以便我可以发现错误。奇怪的是,当我复制并粘贴字符串,并将其用作硬编码值时,我的代码工作正常。只有我从字节流处理的字符串有问题。感谢您的快速回复。我需要此代码在iOS 7及以上版本上运行(客户要求)。但是,我可以使用#available来使用这两种方法。奇怪的是,当我从输出中复制并粘贴我的日期字符串并将其作为文本输入时,日期转换工作正常。所使用的字符串是从ASCII编码的UInt8数组转换而来的,然后再输入到该函数中。然后它会经历各种删除尾随/前导空格等的操作。我想知道是否有隐藏字符正在通过。不过,我希望有更多的迹象。如果我们能看到值数组的样子,我们应该能够对其进行诊断。字符串中隐藏了一个控制字符。创建字符串时出错,导致字符串无法通过。
    let formatter = ISO8601DateFormatter()
    
    if let date = formatter.date(from: string) {
        return date
    } else {
        ...
    }