Ошибка DateFormater только при работе на iOS 13 - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть функция для преобразования строки в формат даты.Эта функция работает должным образом на iOS 12, но на iOS 13. Я получаю эту ошибку:

"Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения"

Вот мой код:

func ConvertDateAndTimeFormat2() {
     let timeDate = "2019-09-24 15:00:00 +0000"
     let dateFormatter = DateFormatter()
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz"
     dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
     var dateObj:Date!
     dateObj = dateFormatter.date(from: timeDate)
     dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
     dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")

     let timeFormatter = DateFormatter()

     timeFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss +zzzz"
     timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
     var timeObj:Date!
     timeObj = timeFormatter.date(from: timeDate)

     timeFormatter.dateFormat = "HH:mm"
     timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00")
     let timef = "\(timeFormatter.string(from: timeObj!))"
     let Date = "\(dateFormatter.string(from: dateObj!))"
 }

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Пожалуйста, измените формат даты и используйте «гггг-ММ-дд ЧЧ: мм: сс Z» и попробуйте.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"

Для получения более подробной информации, пожалуйста, посетите https://nsdateformatter.com/

0 голосов
/ 25 сентября 2019

Есть много проблем с вашим кодом.Нет причин создавать два Date объекта из одной строки.Просто проанализируйте оригинальную строку один раз.Затем вы можете создать свою строку даты и строку времени с желаемыми форматами из этой одной даты.

Вам также следует использовать специальный языковой стандарт en_US_POSIX при анализе строк даты фиксированного формата.Также нет необходимости устанавливать часовой пояс при разборе исходной строки даты.Строка предоставляет свой часовой пояс.+0000 означает, что это время UTC.

Возможно, вы не захотите указывать часовой пояс при преобразовании даты в ваши окончательные строки.Скорее всего, вам нужны строки в часовом поясе пользователя, а не в каком-то жестко закодированном часовом поясе.

Вот ваш код, который много очищен:

func convertDateAndTimeFormat2() {
    let timeDate = "2019-09-24 15:00:00 +0000"

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    if let dateObj = dateFormatter.date(from: timeDate) {
        dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") // Probably not needed

        let timeFormatter = DateFormatter()
        timeFormatter.dateFormat = "HH:mm"
        timeFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") // Probably not needed

        let timef = timeFormatter.string(from: dateObj)
        let datef = dateFormatter.string(from: dateObj)
        print("Date: \(datef), time: \(timef)")
    }
}

convertDateAndTimeFormat2()

Вывод:

Дата: вторник, 24 сентября 2019 года, время: 18:00

...