A Date
объект просто представляет момент времени. «Я должен показать это через 12 часов или 24 часа» - это не то, о чем Date
объекты знают. Это особенность строк, генерируемых (или потребляемых) DateFormatter
.
Итак, несколько мыслей:
Форматер даты dateFormat
(и locale
) определяет, как будет выглядеть строка при вызове string(from:)
, (Он также будет определять, как интерпретировать строку и создавать объект Date
при вызове date(from:)
, но здесь это не имеет значения.)
Итак, если вы ищете строковое представление date, используя 24-часовые часы, посмотрите на строку, сгенерированную методом string(from:)
форматера даты. Это строка dateToString
в вашем примере.
Но, если впоследствии вы сгенерируете объект Date
из метода date(from:)
средства форматирования, полученный Date
не будет захватывать использовать ли 12 против 24 часов. Если вы print
этот Date
объект, он не будет отражать ваши предпочтения часов на 12/24 часа.
Итог, беспокойтесь только по поводу am / pm против 24-часовой часы при просмотре String
объектов, сгенерированных (или переданных) DateFormatter
. Не беспокойтесь о формате вывода при печати объекта Date
, так как он предназначен только для целей отладки и не будет фиксировать это значение am / pm против 24-часового измерения часов.
Вы сказали:
В заключительном утверждении приводится формат «2020-04-09 4:23:27 am +0000».
Если вы видите +0000
, это говорит о том, что вы печатаете сам объект Date
. dateFormat
и locale
DateFormatter
управляют только форматом строки, сгенерированной string(from:)
(и тем, как строки анализируются).
Итак, выведите строку, сгенерированную DateFormatter
, а не Date
объектами. Печать объекта Date
всегда будет в этом заранее заданном формате. В приложении, если вам нужен вывод в заданном формате, используйте String
, сгенерированный DateFormatter
, а не Date
объектами.
Рассмотрим более очевидный пример проблемы, когда DateFormatter
используется для создания строки в совершенно другом формате:
let now = Date()
print(now) // 2020-04-07 11:54:58 +0000
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
let string = formatter.string(from: Date())
print(string) // April 7, 2020 at 4:54:58 AM PDT
if let date = formatter.date(from: string) {
print(date) // 2020-04-07 11:54:58 +0000
}
Итак, хотя этот форматтер успешно преобразовал Date
в String
и обратно, этот окончательный print
оператор использует тот же фиксированный формат, что и первый оператор print
, потому что я просто печатаю объект Date
. Я не обеспокоен тем, что последнее утверждение print
не соответствует конфигурации моего DateFormatter
. Я не ожидал бы этого. Когда я печатаю Date
, он всегда находится в этом фиксированном, заранее заданном формате. Я беспокоюсь только о формате строк, сгенерированных DateFormatter
(вторым оператором print
).
Кроме того, есть второстепенные вопросы о вашем формате "yyyy-MM-dd HH:mm:ss"
. Какой часовой пояс это представляет? Ваш местный часовой пояс? Часовой пояс вашего сервера? GMT / UTC / Zulu? Мы часто используем строки даты ISO8601 / RFC3339 (например, 2020-04-07T11:54:58Z
), чтобы устранить эту неоднозначность. Сначала вы должны обнять свой первоначальный вопрос, но, когда он у вас за спиной, вам захочется внимательно посмотреть, почему вы храните его в этом формате, и как вы хотите правильно обращаться с часовыми поясами. Но обо всем по порядку.