将日期字符串转换为日期对象

时间:2020-02-05 12:11:22

标签: ios swift dateformatter

实际字符串-January 31, 2020 at 11:59:59 p.m. (ET). 格式-"MMMM d, yyyy 'at' hh:mm:ss aa" 无法将此字符串转换为Date对象。尝试了各种日期格式,但无法将字符串更改为Date对象。 请帮忙

2 个答案:

答案 0 :(得分:1)

您可以删除.p之间的非标准字符m,并在时区周围转括号

let dateString = "January 31, 2020 at 11:59:59 p.m. (ET)"
let trimmedDateString = dateString.replacingOccurrences(of: ".m.", with: "m")
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a (v)"
let date = formatter.date(from: trimmedDateString)

答案 1 :(得分:0)

let raw = "January 31, 2020 at 11:59:59 p.m. (ET)"

func getDateFrom(_ raw: String) -> Date? {

    if let i = (raw.range(of: "(")?.lowerBound) { // get index of open parenthesis

        var zone: TimeZone?
        let dateString = String(raw.prefix(upTo: i)) // January 31, 2020 at 11:59:59 p.m.
        let zoneString = String(raw.suffix(from: i)) // (ET)

        switch zoneString { // determine time zone

        case "(ET)", "(EST)", "(EDT)": // study your data source and learn how they may express time zones
            zone = TimeZone(abbreviation: "EDT")

        default:
            return nil // failure

        }

        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a"
        formatter.timeZone = zone
        formatter.amSymbol = "a.m."
        formatter.pmSymbol = "p.m."

        if let date = formatter.date(from: dateString) {
            return date
        } else {
            return nil
        }

    } else {
        return nil
    }

}

if let date = getDateFrom(raw) {
    print(date) // 2020-02-01 04:59:59 +0000
}

这应该是一个很好的起点。有多种方法可以执行此操作,例如,如果无法确定时区是否希望它失败,如何提取时区(使用缩写,标识符,格林尼治标准时间(GMT)的秒数)等。我喜欢vadian的如果我对时区完全满意,请回答。但是,时区以字符串表示时是如此不一致并且令人惊讶地没有标准化,我宁愿使用一种机制来获取它并确保它是有效的。

也就是说,这是一个我将要开始的地方的相对粗略的例子-完成的版本会更加细微。在此示例中,如果时区失败,则功能失败。