Почему может не работать DateFormatter
Когда мы интегрируем наше iOS приложение в с различными сервисами нам рано или поздно приходится обрабатывать строковое представление даты в свои структуры. И при особых ситуациях может произойти так, что DateFormatter
просто не может получить дату, учитывая что формат единый. Такими ситуациями может служить то, что у пользователя указан другой календарь или же отличный формат представления времени (24/12 часовой), даже если вы жестко указали, что ожидатете 24-часовой формат.
Повторить такую проблему можно выставим другой регион на телефоне, например UK, и поставив 12-часовой формат отображения данных.
Решение такой проблемы достаточно простое. Допустим мы имеем такую инициализацию:
let formatter = DateFormatter()
formatter.dateFormat = "MM-dd-yyyy HH:mm"
Решение достаточно простое
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
Для пущей надежности можно даже указать григорианский календарь
formatter.calendar = Calendar(identifier: .gregorian)
Но проблему решить удается и простым указанием локали и часвого пояса. Однако стоит поправить часовой пояс на нужный, если с сервера приходят даты не по UTC.
Почему же локаль en_US_POSIX
? В принципе можно использовать и локаль сервера, однако документацией это подается как наиболее универсальный вариант, который поможет в "большинстве" случаев. При чем сам формат является статичным и даже при условии, если в штатах произойдут какие то изменения в форматах дат, то для POSIX
(С локаль) ничего не поменяется. Тем самым мы ничем не рискуем используя эту локаль.
Так же хотелось бы напомнить, что с iOS 10.0 нам доступен отдельный форматтер для ISO8601 - ISO8601DateFormatter. Так что если вы используете этот формат, то можно избавится от пары строк кода.