Почему может не работать DateFormatter

Почему ваш DateFormatter может не работать в некоторых регионах

Почему может не работать DateFormatter
Photo by Nick Hillier / Unsplash

Когда мы интегрируем наше 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. Так что если вы используете этот формат, то можно избавится от пары строк кода.