2015-11-26 4 views
2

У нас есть база данных с географическими координатами. Как только мы заполнили его соответствующими часовыми поясами, используя tzworld. Пользователь устанавливает местоположение, включая город, город имеет часовой пояс - здесь, как мы знаем часовой пояс пользователя (нам нужно отображать дату и время на сервере). Но изменяются часовые пояса: появляются некоторые новые, некоторые старые удаляются.Как обрабатывать новый часовой пояс?

Есть ли какие-либо рекомендации или инструменты для обработки таких изменений?

I.e. есть город Foo с часовым поясом Foo/Bar. Однажды tzdata был изменен, и Foo/Bar был разделен на Foo/Old_Bar и Foo/New_Bar часовых поясов с одинаковыми смещениями UTC. У нас все еще есть Foo/Bar в нашем db. На самом деле, это перерыв в BC, но это нормально, поскольку, скажем, мы можем справиться с этими перерывами BC. Но затем tzdata снова был изменен, и теперь Foo/New_Bar имеет другое смещение. И здесь возникают неприятности. Некоторые пользователи из Foo city смотрят неправильное местное время.

Для того чтобы быть уверенным, что вы меня правильно поняли: это не про DST, речь идет о том, что изменяются часовые пояса (их имена).

Насколько я могу судить, нам нужен какой-то машиночитаемый tzdata diff. Как

split: Foo/Bar Foo/Old_Bar,Foo/New_Bar 
move: Foo/New_Bar -05:00 

Эта проблема заставляет меня чувствовать, что хранение часовых поясов - плохая идея. Есть ли лучший?

+0

Не умеют ли это делать библиотеки датировки? (Отслеживайте изменения часового пояса и т. Д.) Можете ли вы указать конкретный пример, где 'Foo/New_Bar' может иметь два разных смещения за ту же дату? Это реальная проблема в мире? (Я не говорю, что это не так - мне просто сложно представить, где это может быть применимо) –

+0

@Pekka 웃 Пока это не вопрос реального мира (главным образом потому, что большинство наших пользователей из регионов со стабильным временем зон), но это легко может быть. Я случайно заметил, что некоторые часовые пояса исчезли, а некоторые появились после недавнего обновления tzdata. Я хочу иметь надежное решение, и эта проблема и особенно отсутствие информации о ней преследуют меня. – ksimka

+0

Но у вас действительно есть прецедент, где это может быть проблемой? Если у вас есть дата и время, то ваша библиотека должна иметь возможность разрешить ее до одного момента времени (и она должна быть способна обрабатывать [сумасшедшие края]; (http://stackoverflow.com/questions/6841333) разработчики [проводят много времени] (http://codeblog.jonskeet.uk/2014/09/30/the-mysteries-of-bcl-time-zone-data/), чтобы убедиться, что они это делают). Если зона исчезает или добавляется, библиотека должна иметь список этих изменений. Это действительно то, что вам нужно для обработки в вашем приложении? –

ответ

3

С учетом базы данных IANA/Olson TZ идентификаторы местоположения не меняются после их создания. История каждого идентификатора всегда соответствует для этого места.

Однако, если вы используете tz_world или какой-либо другой источник карты, чтобы определить часовой пояс для некоторых других места - тот, который не обязательно это собственного идентификатора, то да - это возможно, что раскол зоны приведет к изменению зоны. Хотя, когда это произойдет, новая зона должна соответствовать старой зоне, вплоть до изменения.

В качестве примера в реальном мире рассмотрим America/Fort_Nelson, который был добавлен в tzdb 2015g для Fort Nelson, Британской Колумбии, Канады и прилегающего к нему региона регионального муниципалитета Северных Скалистых гор. Ранее эта область была бы разрешена до America/Vancouver, но зона была разделена из-за their March 2015 time change. Карты tz_world были обновлены 7 ноября 2015 года для учета этого изменения.

  • Если ранее разрешен пользователю в Форт-Нельсон America/Vancouver, то они будут иметь некорректные раз с 1-го ноября 2015 года вперед, так как это, когда Ванкувер переключается обратно в UTC-8, в то время как Форт Нельсон оставался в UTC -7.

  • Если вы обновляетесь до последних tzdb и tz_world, вы можете использовать исходную информацию для переопределения часового пояса - теперь это будет America/Fort_Nelson.

  • Новый часовой пояс будет точно отражать всю ту же информацию, что и Ванкувер перед расколом, и правильную информацию для Fort Nelson после раскола.

Все это должно работать, если вы обновление часовых поясов после каждого обновления tz_world, и пересчитать будущие события после обновления tzdb.

Вопрос остается, откуда вы знаете, какие зоны были разделены и изменены, поэтому вам не нужно пересчитывать все? Для небольшого количества данных вы также можете пересчитать все. Но для больших наборов данных это может оказаться непрактичным. К сожалению, стандартного формата для различий нет машиносчитываемого стандартизованного формата. Я считаю, что об этом говорили в the tz discussion list, но я не могу найти его в данный момент. Вы можете спросить, если хотите.

В настоящее время единственный способ - вручную прочитать примечания к выпуску каждого обновления. Вы можете найти их в the tz-announce list archives (или подписаться на список для будущих обновлений). Вы также можете найти их в файле NEWS любого выпуска. Вы также захотите просмотреть историю шейп-файла tz_world, который находится на этом веб-сайте.

Также признайте, что идентификаторы часовых поясов никогда не будут удален от tzdb. Разделение может создать новую зону (Foo/New_Bar), но исходная зона останется (Foo/Bar, а не Foo/Old_Bar). Если зона определена без необходимости, ее запись Zone может быть заменена записью Link, но она никогда не будет полностью удалена.

+0

Отличный ответ, спасибо большое! Собственно, этот раскол с Фортом Нельсоном - это именно тот случай, который заставил меня задуматься над всей проблемой и задать этот вопрос здесь. – ksimka

Смежные вопросы