Ios 使用DateFormatter将此字符串解析为日期?

Ios 使用DateFormatter将此字符串解析为日期?,ios,swift,date,Ios,Swift,Date,我正在访问一个返回以下格式字符串的Web服务: yyyy-MM-dd'HH:mmZ 它非常接近标准的UTC格式,但最后没有ss。我的问题是我的dateFormatter总是返回nil…我已经尝试确保区域设置和其他所有设置都正确 以下是实际字符串的示例: 2019-12-26T00:00Z 以下是创建DF的代码: extension DateFormatter { @objc static func defaultDateFormat(_ format: String) -> Dat

我正在访问一个返回以下格式字符串的Web服务:

yyyy-MM-dd'HH:mmZ

它非常接近标准的UTC格式,但最后没有ss。我的问题是我的dateFormatter总是返回nil…我已经尝试确保区域设置和其他所有设置都正确

以下是实际字符串的示例:

2019-12-26T00:00Z

以下是创建DF的代码:

extension DateFormatter {
    @objc static func defaultDateFormat(_ format: String) -> DateFormatter {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "US")
        formatter.dateFormat = format
        return formatter
    }

    func date(from string: String?) -> Date? {
        if let string = string {
            return self.date(from: string)
        } else {
            return nil
        }
    }

    func string(fromOptional date: Date?) -> String? {
        if let date = date {
            return self.string(from: date)
        } else {
            return nil
        }
    }

    func string(fromOptional date: Date?, defaultStr: String) -> String {
        return self.string(fromOptional: date) ?? defaultStr
    }
}

let df = DateFormatter.defaultDateFormat("yyyy-MM-dd'T'HH:mmZ")
let date: Date? = df.date(from: __dateString__) // always nil
一些意见:

您希望使用en_US_POSIX的区域设置,这是一种始终适用于ISO 8601/RFC 3339日期字符串的不变区域设置。看

如果要使用此格式化程序将日期转换回类似2019-12-26T00:00Z的字符串,则需要:

在格式字符串中使用X或ZZZZZ或XXXXX,而不是Z。请参阅表中的“区域”部分,您将看到这些不同的时区模式,例如Z、ZZZZ和X是如何解释的;和 将格式化程序的时区设置为使用Zulu/GMT/UTC。 因此:

一些意见:

您希望使用en_US_POSIX的区域设置,这是一种始终适用于ISO 8601/RFC 3339日期字符串的不变区域设置。看

如果要使用此格式化程序将日期转换回类似2019-12-26T00:00Z的字符串,则需要:

在格式字符串中使用X或ZZZZZ或XXXXX,而不是Z。请参阅表中的“区域”部分,您将看到这些不同的时区模式,例如Z、ZZZZ和X是如何解释的;和 将格式化程序的时区设置为使用Zulu/GMT/UTC。 因此:


另外,由于夏令时变化的问题,建议设置时区。顺便说一句,我们没有地区设置。谢谢!我已经改变了这一点,但每次仍然看到零。有什么想法吗?另外,由于夏令时变化的问题,建议设置时区。顺便说一下,我们没有地区设置。谢谢!我已经改变了这一点,但每次仍然看到零。有什么想法吗?太棒了!你能帮我理解“X”的实用程序和设置时区吗?用Z试试,看看你从日期转换回字符串时得到了什么。你会得到类似2019-10-15T22:57+0000的东西,这不是你想要的。请参见表中的“区域”部分,您将看到如何解释Z、ZZZZZ和X。重新设置时区,尝试删除该行,然后再次查看从日期生成字符串时发生的情况。你会在你的本地时区中得到一个字符串,例如,如果我在我的计算机上生成一个字符串,它会显示2019-10-15T16:02-07:00,而你的服务器可能会假设它是Zulu/GMT/UTC,用Z指定,而不是-07:00或任何你的本地时区。太棒了!你能帮我理解“X”的实用程序和设置时区吗?用Z试试,看看你从日期转换回字符串时得到了什么。你会得到类似2019-10-15T22:57+0000的东西,这不是你想要的。请参见表中的“区域”部分,您将看到如何解释Z、ZZZZZ和X。重新设置时区,尝试删除该行,然后再次查看从日期生成字符串时发生的情况。您将在本地时区中获得一个字符串,例如,如果我在我的计算机上生成一个字符串,它会显示2019-10-15T16:02-07:00,而您的服务器可能会假设它将以Zulu/GMT/UTC为单位,用Z指定,而不是-07:00或任何您的本地时区。
@objc static func defaultDateFormat(_ format: String) -> DateFormatter {
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.dateFormat = format
    return formatter
}
let df = DateFormatter.defaultDateFormat("yyyy-MM-dd'T'HH:mmX")
let date = df.date(from: "2019-12-26T00:00Z")
let string = df.string(from: Date())