在 Swift 中解析 Javascript new Date().toString()

Parse Javascript new Date().toString() in Swift

我需要解析 swift 中的 javascript 日期。由于日期已经存储在某些数据库中,因此我无法更改它们的格式。我只需要将它们解析为 swift.

中的正确日期

下面是 javascript 的 toString() 函数的示例结果。这取决于 Locale/Language

// js
new Date().toString()
'Tue Jun 01 2021 14:11:27 GMT+0900 (JST)'
'Tue Jun 01 2021 14:03:45 GMT+0900 (Japan Standard Time)'
'Mon May 31 2021 17:38:31 GMT+0800 (中国標準時)'
'Mon May 31 2021 19:25:37 GMT+0930 (オーストラリア中部標準時)'

如何在 Swift DateFormatter 中解析它?

我试过这个:

// swift
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z (zzz)"

Date-> String 转换看起来正确但 String -> Date 不起作用

// swift
dateFormatter.string(from: Date())
> "Tue Jun 01 2021 14:11:27 GMT+0900 (JST)"
dateFormatter.date(from: "Tue Jun 01 2021 14:11:27 GMT+0900 (JST)")
> nil

非常感谢任何帮助。

如@Sweeper 的评论中所述 - 时区名称部分取决于实现 - 可以从 docs

中确认
Optionally, a timezone name consisting of:
space
Left bracket, i.e. "("
An implementation dependent string representation of the timezone, which might be an abbreviation or full name (there is no standard for names or abbreviations of timezones), e.g. "Line Islands Time" or "LINT"
Right bracket, i.e. ")"

所以我们需要 - 删除末尾括号内的部分并解析其余部分 - 如@Joakim Danielson 所述

考虑到这一点,我们可以这样做-

extension String {
    
    static private var jsDateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z"
        return formatter
    }()
    
    func parsedDate() -> Date? {
        let input = self.replacingOccurrences(of: #"\(.*\)$"#, with: "", options: .regularExpression)
        return String.jsDateFormatter.date(from: input)
    }
    
}

测试

func testJSDateParsing() {
    [
        "Tue Jun 01 2021 14:11:27 GMT+0900 (JST)",
        "Tue Jun 01 2021 14:03:45 GMT+0900 (Japan Standard Time)",
        "Mon May 31 2021 17:38:31 GMT+0800 (中国標準時)",
        "Mon May 31 2021 19:25:37 GMT+0930 (オーストラリア中部標準時)",
    ].forEach({
        if let date = [=12=].parsedDate() {
            print("Parsed Date : \(date) for input : \([=12=])")
        }
        else {
            print("Failed to parse date for : \([=12=])")
        }
    })
}

输出

Parsed Date : 2021-06-01 05:11:27 +0000 for input : Tue Jun 01 2021 14:11:27 GMT+0900 (JST)
Parsed Date : 2021-06-01 05:03:45 +0000 for input : Tue Jun 01 2021 14:03:45 GMT+0900 (Japan Standard Time)
Parsed Date : 2021-05-31 09:38:31 +0000 for input : Mon May 31 2021 17:38:31 GMT+0800 (中国標準時)
Parsed Date : 2021-05-31 09:55:37 +0000 for input : Mon May 31 2021 19:25:37 GMT+0930 (オーストラリア中部標準時)