Как конвертировать yyyy-MM-dd'T'HH: mm: ss.SSS'Z 'в MM-dd-гггг в быстрой - PullRequest
0 голосов
/ 06 марта 2020

Здравствуйте, мне нужно изменить формат даты

Я получаю ответ от бэкэнда, например

dob = "1989-03-06T00: 00: 00Z";

в моем случае я пишу следующий код, но мое приложение не работает, я думаю, что мой текущий формат даты неправильный.

func DateFromWebtoApp(_ date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    let date = dateFormatter.date(from: date)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    return  dateFormatter.string(from: date!)
}

Ответы [ 4 ]

2 голосов
/ 06 марта 2020

Пожалуйста, посмотрите на строку даты. Нет миллисекунд (S), а Z является спецификатором формата (без одинарных кавычек).

Далее для произвольного формата даты всегда добавляйте фиксированный Locale

func dateFromWebtoApp(_ dateString: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from: dateString)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    return dateFormatter.string(from: date!)
}
1 голос
/ 06 марта 2020

Попробуйте, это работает на моей стороне.

func DateFromWebtoApp(_ date: String) -> String
{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date = dateFormatter.date(from: date)
    dateFormatter.dateFormat = "MM-dd-yyyy"
    dateFormatter.timeZone = .current
    return  dateFormatter.string(from: date!)
}
0 голосов
/ 06 марта 2020

Форматеры даты, как известно, требуют больших вычислительных ресурсов. Они также вычислительно дорогие, чтобы изменить dateFormat. Поэтому я предлагаю вам заранее объявить два свойства средства форматирования даты и создать их один раз и только один раз.

let isoDateFormatter = ISO8601DateFormatter()

let dobFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    return formatter
}()

Первый, isoDateFormatter предназначен для преобразования строк из вашего бэкенда в Date объекты. Используя ISO8601DateFormatter, вы избавляетесь от необходимости вручную настраивать locale для DateFormatter.

Второй dobFormatter предназначен для преобразования объекта даты рождения Date в строка, которая будет представлена ​​в вашем пользовательском интерфейсе. Для этого второго средства форматирования, пожалуйста, обратите внимание, что:

  • Я не использую dateFormat, а скорее dateStyle (поэтому результат учитывает предпочтения локализации даты конкретного устройства, где пользователи из Великобритании увидит «6 марта 1989 года», а пользователи из США увидят «6 марта 2019 года»). Используйте .short вместо .medium, если вы действительно хотите видеть dd/MM/yy для пользователей из Великобритании и MM/dd/yy для пользователей из США. Но лично мне нравится средний формат, так как он достаточно краткий, но также и однозначный. Если у меня есть место, я использую длинный формат, который наиболее естественно представляет дату (например, «6 марта 2019 года», а не «6 марта 2019 года»). Делайте все, что требует ваш пользовательский интерфейс.

    Но если это для представления конечному пользователю, вам действительно следует избегать жестко закодированных строк формата даты, поскольку пользователи хотят видеть даты, представленные в соответствии со своим личным устройством. настройки локализации, а не то, что предпочитает одно приложение или другое. И нет никаких причин ограничивать ваше приложение для пользователей из США, потому что однажды вы захотите охватить более широкую аудиторию.

  • Я установил часовой пояс для этого выходного форматера как GMT, потому что это Строка представляет дату, а не объединенную дату / время. Например, 1989-03-06T00:00:00Z, то есть полночь 6 марта 1989 года по Гринвичу, означает, что 5 марта для нас в Калифорнии это 16:00. Но когда вы представляете дату рождения, вы хотите сказать 6 марта, а не 5 марта. Короче говоря, вы хотите игнорировать информацию о времени и часовом поясе. Вы делаете это, используя GMT / UTC / Zulu для вашего выходного форматера даты.

В любом случае, вы будете использовать его так:

let input = "1989-03-06T00:00:00Z"
if let dob = isoDateFormatter.date(from: input) {
    let output = dobFormatter.string(from: dob)
}
0 голосов
/ 06 марта 2020

Поскольку эта входная строка даты имеет формат даты жалобы ISO, вы можете использовать ISO8601DateFormatter.

func dateFromWebtoApp(_ inDate: String) -> String? {
    let inFormatter = ISO8601DateFormatter()
    if let date = inFormatter.date(from: inDate) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy"
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.string(from: date)
    }
    return nil
}

Поскольку создание форматеров даты довольно дорого, возможно, стоит объявить их вне функции и держите их по возможности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...