Форматеры даты, как известно, требуют больших вычислительных ресурсов. Они также вычислительно дорогие, чтобы изменить 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)
}