Качество данных

Часовые пояса со смещением в полчаса и 45 минут: объяснение

Большинство разработчиков пишут свой первый код для работы с часовыми поясами, предполагая, что каждое смещение составляет целое число часов от UTC. Это предположение верно для большинства поясов, а потом ломается, как только приходит запрос из места, где оно не выполняется. В ряде частей мира используются смещения с половиной часа, а как минимум в одном регионе используется смещение в 45 минут, и ни один из этих случаев не является пограничным в смысле редкости или некорректности. Просто так эти места решили выставлять свои часы относительно солнца и соседей.

Смещение в полчаса обычно отражает то, что долгота страны находится между двумя стандартными часовыми поясами, и было принято решение взять середину, а не округлять в одну сторону. Смещение в 45 минут встречается ещё реже и, как правило, отражает похожее промежуточное положение в сочетании с сознательным решением отличаться от стандартного смещения соседа. Ни то ни другое не является ошибкой в данных. Оба варианта это законные официальные часовые пояса, которые учитываются в базе данных IANA так же, как любой пояс с целым числом часов.

На самом деле программы ломаются на вычислениях с датой и временем, в которых жёстко зашиты допущения. Код, который округляет смещения до ближайшего часа, хранит смещение как целое число часов или строит выпадающий список часовых поясов только с шагом в целый час и полчаса, будет молча неправильно обрабатывать эти пояса. Причём сбой обычно тихий. Время будет сдвинуто на пятнадцать или тридцать минут, а не вызовет очевидную ошибку, поэтому баг легко пропустить при тестировании, и он проявится только тогда, когда реальный пользователь в затронутом регионе сообщит, что что-то не так.

Решение простое, если закладывать его с самого начала: всегда работайте с фактическим смещением от UTC, возвращённым для пояса, с точностью до минуты, а не предполагайте его и не округляйте до часов. По возможности храните и сравнивайте названия поясов, а не смещения, поскольку название несёт точное текущее и историческое смещение, и вам не нужно ничего жёстко прописывать.

Определение часового пояса, которое возвращает точное смещение вместе с названием пояса IANA, избавляет от догадок. Запрашивайте координаты или пояс напрямую, а не выводите смещение места только из его страны или региона, поскольку смещения могут различаться в пределах одной страны и редко везде аккуратно совпадают с целым часом.