Преобразование времени даты UTC в местное время даты в iOS - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь преобразовать дату в формате UTC в местное время, и ниже указан мой код.

func dateTimeStatus(date: String) -> String{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    let dt = dateFormatter.date(from: date)

    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"

    return dateFormatter.string(from: dt!) // .string(from: dt!)
}

Приведенный выше набор кодов работает, когда язык системы (iPhone или iPad) установлен на * 1004.* английский (Индия) .Если я изменю язык на японский, то будет сгенерировано исключение, как показано ниже.

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

при return оператор.

Я очень хорошо знаю, что я путаюсь с dateFormatter, из-за которого дата не распознается dateFormatter.date (from: date) .Следовательно, нулевое значение присваивается dt.

Любые предложения по общему использованию формата даты и времени для всех системных языков были бы полезны.

1 Ответ

0 голосов
/ 06 июня 2018

Всякий раз, когда вы пытаетесь проанализировать строку даты фиксированного формата, вам нужно установить локаль форматера в специальную локаль en_US_POSIX.Это касается многих возможных проблем, включая регион и язык пользователя, а также настройки пользователя на 12/24 часа.

dateFormatter.locale = Locale(identifier: "en_US_POSIX")

Затем сбросьте его на локаль пользователя вместе с часовым поясом.

dateFormatter.locale = Locale.current

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

Обновленный код:

func dateTimeStatus(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    if let dt = dateFormatter.date(from: date) {
        dateFormatter.locale = Locale.current
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"

        return dateFormatter.string(from: dt)
    } else {
        return "Unknown date"
    }
}

Вам также следует рассмотреть возможность использования стиля даты и времени вместо фиксированногоформат при представлении даты / времени пользователю.Это гарантирует, что дата в дружественном формате.В вашем случае у вас есть реальная проблема.

Допустим, вы получили результат «06/05/18 10:30:00 am».

Какая дата это?В зависимости от того, где вы живете, это может быть 5 июня 2018 года. Это может быть 6 мая 2018 года. Это может быть 18 мая 2006 года. Это очень неоднозначно.

Лучше использовать что-то вроде:

func dateTimeStatus(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/dd/yy hh:mm:ss a"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    if let dt = dateFormatter.date(from: date) {
        let userFormatter = DateFormatter()
        userFormatter.dateStyle = .medium // Set as desired
        userFormatter.timeStyle = .medium // Set as desired

        return userFormatter.string(from: dt)
    } else {
        return "Unknown date"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...