簡體   English   中英

如何處理多種日期格式?

[英]How to handle multiple date formats?

當我到達下面的df.date()行時,當使用具有以下格式的日期2016-12-27 14:40:46 +0000時,應用程序崩潰:

致命錯誤:解開Optional值時意外發現nil

我也看到了這一點:

錯誤:執行被中斷,原因:EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子代碼= 0x0)

我有可以采用這種格式的字符串

12/27/2016

但有時采用這種格式

2016-12-27 14:40:46 +0000      

這是在上述格式下崩潰的代碼段:

let mydate = "12/27/2016" //this works but not the longer format
let df = DateFormatter()
df.dateFormat = "MM/dd/yyyy" //this is the format I want both dates to be in
newDate:Date = df.date(from: mydate)

我如何使用一個功能處理兩種格式?

檢查日期字符串是否包含斜杠,並相應地設置日期格式:

if mydate.contains("/") {
    df.dateFormat = "MM/dd/yyyy"
}  else {
    df.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
}

您可以嘗試一種在代碼中非常干凈的方法。 您可以添加此擴展名:

extension DateFormatter {

    func dateFromMultipleFormats(fromString dateString: String) -> Date? {
        var formats: [String] = [
        "yyyy-MM-dd hh:mm:ss.SSSSxx",
        "yyyy-MM-dd hh:mm:ss.SSSxxx",
        "yyyy-MM-dd hh:mm:ss.SSxxxx",
        "yyyy-MM-dd hh:mm:ss.Sxxxxx",
        "yyyy-MM-dd hh:mm:ss"
        ]
    for format in formats {
        self.dateFormat = format
        if let date = self.date(from: dateString) {
                return date
            }
        }
        return nil
    }
}

然后只需嘗試將函數中的formats數組更改為您可能需要的任何格式。 現在只需使用您的格式化程序,如下所示:

if let myDate = dateFormatter.dateFromMultipleFormats(fromString: mydate) {
    print("success!")
} else {
    print("add another format for \(mydate)")
}

我認為最好的方法是使用兩個DateFormatters ,一個用於iso8601格式,另一個用於這種短格式。

(下面的代碼使用DateFormatter的擴展名,但是這兩個格式化程序可以使用method / helper /其他任何方法)

迅捷3

extension DateFormatter {
    static let iso8601DateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar.current // Set the Calendar
        formatter.timeZone = TimeZone(secondsFromGMT: 0) // Set the timezone
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
        return formatter
    }()

    static let shortDateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar.current // Set the Calendar
        formatter.timeZone = TimeZone(secondsFromGMT: 0) // Set the timezone
        formatter.dateFormat = "MM/dd/yyyy"
        return formatter
    }()

    static func date(string: String) -> Date? {
        if let iso8601Date = iso8601DateFormatter.date(from: string) {
            return iso8601Date
        } else if let shortDate = shortDateFormatter.date(from: string) {
            return shortDate
        } else {
            return nil
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM