为什么日期格式化程序崩溃?



我的以下代码工作正常。 我不知道为什么它有时会崩溃(主要是在应用程序启动时。 ~100 例中的 1 例(。

extension Formatter {
static let enUSPOSIX: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")//
return formatter
}()
}

let dateFormatter = Formatter.enUSPOSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+hh:mm"
let date = dateFormatter.date(from: "2018-05-13T00:00:00+05:30")
dateFormatter.timeZone = TimeZone(identifier: "UTC")
let calendar = Calendar.current
let dayComponent = calendar.component(.year, from: date!)//crashes here sometime
print(dayComponent)

基本上你的日期格式是错误的。时区+05:30ZZZZZ+hh:mm,请阅读 unicode.org 日期格式模式

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"

编辑:

对于这种标准的ISO8601格式,我更喜欢ISO8601DateFormatter

let dateFormatter = ISO8601DateFormatter()
let date = dateFormatter.date(from: "2018-05-13T00:00:00+05:30")

今天我遇到了完全相同的问题。由于在open func date(from string: String) -> Date?上强制展开,应用程序在生产中随机崩溃

我的代码看起来像这样:

let creationDate: Date = {
let dateFormatter = DateFormatter()
return dateFormatter.date(from: "19-06-2018 14:00")!
}()

经过调查,我意识到崩溃只出现在在设备设置中设置了 12 小时日期格式的设备上。在这些情况下,14:00不存在,因为它应该是"下午 2:00"。

只需更改代码即可解决此问题:

let creationDate: Date = {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
return dateFormatter.date(from: "19-06-2018 14:00")!
}()

在我的一个应用程序上进行测试时遇到了同样的问题

let dateFormatter = Formatter.enUSPOSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+hh:mm"
let date = dateFormatter.date(from: "2018-05-13T00:00:00+05:30")
dateFormatter.timeZone = TimeZone(identifier: "UTC")
let calendar = Calendar.current
let dayComponent = calendar.component(.year, from: date!)

这是崩溃,因为日期对象为零,所以当在 dayComponent 行中解开日期时,这会崩溃。 试试这个

let dateFormatter = Formatter.enUSPOSIX
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+hh:mm"
if let date = dateFormatter.date(from: "2018-05-13T00:00:00+05:30"){
dateFormatter.timeZone = TimeZone(identifier: "UTC")
let calendar = Calendar.current
let dayComponent = calendar.component(.year, from: date!)
}else{
dateFormatter.dateFormat = "yyyy-MM-dd'T'hh:mm:ss+hh:mm" // Date as 12 hour  
if let date = dateFormatter.date(from: "2018-05-13T00:00:00+05:30"){
dateFormatter.timeZone = TimeZone(identifier: "UTC")
let calendar = Calendar.current
let dayComponent = calendar.component(.year, from: date!)
} else{
print("Cannot format Date")
}
}

最新更新