DateFormatter дает мне неправильный результат, пока я конвертирую String в Date в британском регионе, а Timezone is Muscat - PullRequest
1 голос
/ 07 апреля 2020

Я хочу "yyyy-MM-dd HH:mm:ss", со временем в 24-часовом формате, но так как у меня в телефоне установлена ​​настройка формата даты 12 часов, а для часового пояса задано значение Muscat, то дата, которую я получаю, всегда имеет формат 12 часов, а я проверка с регионом Великобритании. Я могу изменить Date() на строку в 24-часовом формате, но пока я изменяю 24-часовую строку на 24-часовую дату, она всегда дает мне 12-часовой формат даты

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateToString = dateFormatter.string(from: Date()) //2020-04-06 15:47:16
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateFromString = dateFormatter.date(from: dateToString)
print(dateFromString) // 2020-04-06 1:47:25 pm +0000

1 Ответ

0 голосов
/ 07 апреля 2020

A Date объект просто представляет момент времени. «Я должен показать это через 12 часов или 24 часа» - это не то, о чем Date объекты знают. Это особенность строк, генерируемых (или потребляемых) DateFormatter.

Итак, несколько мыслей:

  • Форматер даты dateFormatlocale) определяет, как будет выглядеть строка при вызове 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), чтобы устранить эту неоднозначность. Сначала вы должны обнять свой первоначальный вопрос, но, когда он у вас за спиной, вам захочется внимательно посмотреть, почему вы храните его в этом формате, и как вы хотите правильно обращаться с часовыми поясами. Но обо всем по порядку.

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