[英]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.