Я получаю ответ от 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
, мой текущий код больше не может ее форматировать. .
Вопрос: Как я могу отформатировать его, даже если заданный формат с сервера успевает?
@koropok, что ты имеешь в виду?, у меня нет кода, в котором есть 00:00:00 ..
я имел в виду всегда заменять «00:00:00» на ваш strFromApi
перед передачей его в вашу format
функцию.
@koropok 00:00:00
это просто пример, а что если у него "11:11:11"?
о, как насчет этого? strFromApi.components(separatedBy: " ").first
@MarkDylanBMercado Итак, вы пытаетесь проанализировать дату в строке JSON, которая иногда имеет компонент времени, а иногда нет?
@LeoDabus точно, да
Вы можете создать собственную стратегию dateDecodingStrategy
это местное время или UTC?
@LeoDabus просто местное время
ХОРОШО. Кстати, вместо того, чтобы выбирать конкретный формат даты, вы должны уважать язык и настройки устройства пользователя. Просто используйте dateStyle и timeStyle при отображении даты пользователю. Проверьте этот пост, как вы должны отображать локализованную дату stackoverflow.com/questions/28332946/…
@koropok это хакерский, я могу принять это как решение моей текущей проблемы, но моя настоящая проблема в том, что сказал ЛеоДабус, что он имеет несколько заданных форматов даты.
Вы можете создать два модуля форматирования даты, один со временем, а другой без него, и использовать оператор объединения 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"
почему бы просто не заменить "00:00:00" на ""?