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

时间:2018-09-05 06:19:42

标签: ios swift nsdate nsdateformatter

我的以下代码运行正常。 我不知道为什么有时候会崩溃(通常是在应用程序启动时发生的。约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)

3 个答案:

答案 0 :(得分:1)

基本上,您的日期格式不正确。时区+05:30ZZZZZ而不是+hh:mm,请阅读unicode.org Date Format Patterns

 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")

答案 1 :(得分:0)

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

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!)

这是崩溃的,因为日期对象为nil,因此当在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")
 }
}

答案 2 :(得分:0)

今天我遇到了完全相同的问题。由于强制展开open func date(from string: String) -> Date?

,应用在生产中随机崩溃

我的代码如下:

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

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

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

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")!
}()