当我到达下面的df.date()行时,如果使用格式为2016-12-27 14:40:46 +0000
的日期,则应用会崩溃:
致命错误:在解包可选值时意外发现nil
我也看到了这一点:
错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP,subcode = 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)
如何使用基本上一个功能处理这两种格式?
答案 0 :(得分:3)
检查日期字符串是否包含斜杠并相应地设置日期格式:
if mydate.contains("/") {
df.dateFormat = "MM/dd/yyyy"
} else {
df.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
}
答案 1 :(得分:2)
您可以尝试在代码中非常干净的方法。您可以添加此扩展程序:
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
}
}
然后尝试将函数中的格式数组更改为您可能需要的任何格式。 现在只需使用这样的格式化程序:
if let myDate = dateFormatter.dateFromMultipleFormats(fromString: mydate) {
print("success!")
} else {
print("add another format for \(mydate)")
}
答案 2 :(得分:0)
我认为最好的方法是使用两个DateFormatters ,一个用于iso8601格式,另一个用于此短格式。
(我的代码下面使用了DateFormatter的扩展,但您可以使用方法/帮助器/其他任何与这两个格式化程序的对象)。
Swift 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
}
}
}