Почему происходит сбой форматера даты? - PullRequest
0 голосов
/ 05 сентября 2018

Мой код ниже работает нормально. Я не знаю, почему иногда происходит сбой (в основном при запуске приложения. 1 случай из ~ 100).

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 голосов
/ 11 сентября 2018

У меня была такая же проблема при тестировании на одном из моих приложений

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")
 }
}
0 голосов
/ 21 ноября 2018

Сегодня я встретил точно такую ​​же проблему. Приложение случайно падает на производстве из-за принудительного развертывания на 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 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")!
}()
0 голосов
/ 05 сентября 2018

Ваш формат даты неверен. Часовой пояс +05:30 равен ZZZZZ, а не +hh:mm, пожалуйста, прочитайте unicode.org Шаблоны формата даты

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

Edit:

Для этого стандартного формата ISO8601 я бы предпочел ISO8601DateFormatter

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