使用'(UTC)'解析长格式日期的NSDateFormatter格式(来自MIME标头)

时间:2018-04-03 16:36:40

标签: ios swift nsdateformatter

我试图解析旧电子邮件中的某些日期' MIME标头:

"Sun, 31 Aug 2008 23:38:35 +0000 (UTC)"

因为有许多不同的,我在循环中创建日期格式化程序字符串。不幸的是,这些都没有抓住这一个,我不知道为什么?

let date = "Sun, 31 Aug 2008 23:38:35 +0000 (UTC)"

extension String {
    func toDate() -> Date? {

        var date: Date?
        let dateFormatter = DateFormatter()
        let formats = [
            "yyyy-MM-dd HH:mm:ss",
            "E, d MMM yyyy HH:mm:ss Z",
            "E, d MMM yyyy HH:mm:ss Z (z)",
            "E, d MMM yyyy HH:mm:ss",
            "yyyy-MM-dd'T'HH:mm:ssZ"
        ]
        formats.forEach { (format) in
            dateFormatter.dateFormat = format
            if let parsed = dateFormatter.date(from: self) {
                date = parsed
            } else {
                print(":(")
            }
        }

        return date
    }
}

date.toDate()

1 个答案:

答案 0 :(得分:1)

格式"E, d MMM yyyy HH:mm:ss Z (z)"适用于"Sun, 31 Aug 2008 23:38:35 +0000 (UTC)"。但它只有在用户的语言环境设置为英语时才有效。解析固定格式的日期字符串时,请务必将日期格式化程序的区域设置设置为en_US_POSIX

dateFormatter.locale = Locale(identifier: "en_US_POSIX")

这不仅可以确保它正确处理英文工作日和月份名称,还可以避免在用户更改其设备上的12/24小时时间设置时出现问题。