Как форматировать строку даты, если заданный формат даты изменяется

Я получаю ответ от API, который представляет собой строку даты, иногда ее формат меняется, поэтому мне нужно форматировать ее динамически,

Вот мой код

import Foundation

func format(from: String?, fromFormat: String, to: String) -> String {
    if from == nil { return "" }
    let inputDateFormatter = DateFormatter()
    inputDateFormatter.dateFormat = fromFormat
    let date = inputDateFormatter.date(from: from ?? "")
    
    let outputDateFormatter = DateFormatter()
    outputDateFormatter.dateFormat = to
    if let date = date {
        return outputDateFormatter.string(from: date)
    }
    return "not formatted"
}

let strFromApi = "2020-12-22"

print(format(from: strFromApi, fromFormat: "yyyy-MM-dd", to: "d MMM yyyy"))

Как видите, у меня есть код, который может успешно форматироваться, проблема здесь в том, что переменная strFromApi была получена из API и меняется между 2020-12-22 и 2020-12-22 00:00:00, когда она меняется на 2020-12-22 00:00:00, мой текущий код больше не может ее форматировать. .

Вопрос: Как я могу отформатировать его, даже если заданный формат с сервера успевает?

почему бы просто не заменить "00:00:00" на ""?

koropok 22.12.2020 04:01

@koropok, что ты имеешь в виду?, у меня нет кода, в котором есть 00:00:00 ..

Dylan 22.12.2020 04:10

я имел в виду всегда заменять «00:00:00» на ваш strFromApi перед передачей его в вашу format функцию.

koropok 22.12.2020 04:14

@koropok 00:00:00 это просто пример, а что если у него "11:11:11"?

Dylan 22.12.2020 04:22

о, как насчет этого? strFromApi.components(separatedBy: " ").first

koropok 22.12.2020 04:30

@MarkDylanBMercado Итак, вы пытаетесь проанализировать дату в строке JSON, которая иногда имеет компонент времени, а иногда нет?

Leo Dabus 22.12.2020 04:38

@LeoDabus точно, да

Dylan 22.12.2020 04:39

Вы можете создать собственную стратегию dateDecodingStrategy

Leo Dabus 22.12.2020 04:40

это местное время или UTC?

Leo Dabus 22.12.2020 04:40

@LeoDabus просто местное время

Dylan 22.12.2020 04:42

ХОРОШО. Кстати, вместо того, чтобы выбирать конкретный формат даты, вы должны уважать язык и настройки устройства пользователя. Просто используйте dateStyle и timeStyle при отображении даты пользователю. Проверьте этот пост, как вы должны отображать локализованную дату stackoverflow.com/questions/28332946/…

Leo Dabus 22.12.2020 04:43

@koropok это хакерский, я могу принять это как решение моей текущей проблемы, но моя настоящая проблема в том, что сказал ЛеоДабус, что он имеет несколько заданных форматов даты.

Dylan 22.12.2020 04:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать два модуля форматирования даты, один со временем, а другой без него, и использовать оператор объединения nil, чтобы обеспечить запасной вариант в случае сбоя первого. Что касается формата даты при возврате окончательной строки, вы должны учитывать языковой стандарт и настройки устройства пользователя. Просто используйте dateStyle и timeStyle при отображении даты пользователю:

extension Formatter {
    static let date: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
    static let dateAndTime: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return formatter
    }()
    static let localizedDate: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .none
        return formatter
    }()
}

extension Date {
    var localizedDate: String { Formatter.localizedDate.string(from: self) }
}

func formatted(from string: String?) -> String {
    guard 
        let string = string,
        let date = Formatter.dateAndTime.date(from: string) ??
                   Formatter.date.date(from: string)
    else { return "" }
    
    return date.localizedDate
}

let strFromApi = "2020-12-22 00:00:00" // "2020-12-22" //
formatted(from: strFromApi)  // "Dec 22, 2020"

Другие вопросы по теме