2016-12-27 83 views
1

当我到下面的df.date()线,当这种格式2016-12-27 14:40:46 +0000日期使用应用程序崩溃:如何处理多种日期格式?

fatal error: unexpectedly found nil while unwrapping an Optional value

而且我也看到了这一点:

error: Execution was interrupted, reason: 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) 

如何处理基本上使用一种功能两种格式?

+1

'数据(来自:)'返回一个可选的,你可以尝试* *使用第一格式从字符串得到'Date',如果返回零,尝试其他格式化程序。最后一行不能编译,我怀疑它会崩溃,没有力量解开 – luk2302

+1

使用两个格式化器,尝试一个,然后另一个。 – Sulthan

+0

相关http://stackoverflow.com/questions/14877489/how-to-parse-iso-8601-using-nsdateformatter-with-optional-milliseconds-part – Sulthan

回答

3

检查日期字符串包含一个斜杠,并相应设置日期格式:

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

我认为要做到这一点的最好办法是使用2 DateFormatters,一个用于ISO8601格式和其他这么短的格式。

(我的代码使用DateFormatter的扩展名,但您可以使用这两个格式化程序的方法/辅助程序/其他任何东西)

斯威夫特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 
     } 
    } 
} 
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)") 
} 
相关问题