Как определить переход на летнее и летнее время для часового пояса в Perl? - PullRequest
5 голосов
/ 14 июля 2010

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

Я использую DateTime и DateTime::Timezone Модули CPAN, которые, кажется, обеспечивают все мыслимые функции, кроме этой!DateTime::Timezone является реализацией базы данных tz / Olson.

Пока я сравниваю локальное смещение с UTC, как сейчас, так и на 24 часа вперед, что позволяет мне пометить, чтоэффект есть, но не точно, когда он возникает.

Мое доказательство концепции вычисляет это каждую минуту.Я думаю, что следующим шагом будет либо:

  • создать таблицу поиска с использованием аналогичного метода в течение следующих 365 дней, чтобы определить затронутые дни, а затем посмотреть на каждый час в эти дни

  • каким-то образом проанализировать правила DST в модуле DateTime::Timezone.

Есть идеи?Я должен отметить, что мои знания Perl довольно просты.


Редактировать:

Похоже, что другой вариант может быть для переноса на PHP и использовать DateTimeZone::getTransitions,Это вернуло массив всех переходов, но PHP 5.3.0 просто добавил необязательные параметры timestamp_begin и timestamp_end, чтобы ограничить диапазон.

Ответы [ 2 ]

9 голосов
/ 14 июля 2010

Недокументированный атрибут _rules объекта DateTime::TimeZone дает массив объектов DateTime::TimeZone::OlsonDB::Rule. Они кодируют начало и конец соблюдения.

my $o = DateTime::TimeZone->new(name => 'Europe/Vienna')->_rules->[1];
say sprintf "%s summertime ends at %s on %s in %s each year", $o->name, $o->at, $o->on, $o->month;

Я советую вам сообщить об ошибке , чтобы запросить обнародование и документирование этого API, чтобы ваш код мог на него полагаться и что он будет должным образом поддерживаться сопровождающими DT.

1 голос
/ 11 августа 2010

Вы можете использовать базу данных tz

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

Для него есть даже модуль perl. "DateTime :: TimeZone содержит скрипт parse_olson, который компилирует источник tz в модули Perl. Он является частью проекта Perl DateTime, который свободно доступен как в рамках лицензии GPL, так и в Perl Artistic License. DateTime :: TimeZone также содержит скрипт tests_from_zdump, который генерирует тестовые случаи для каждого тактового перехода в базе данных tz. "

Как вы сказали, вы уже используете этот модуль, но похоже, что вы не используете все его функции. Я не уверен, какая часть кода tz предоставляется через модуль DateTime :: TimeZone. В этом случае вам может быть лучше назвать это. Существует ряд веб-сервисов, уже использующих базу данных tz, поэтому она хорошо используется.

Вы, вероятно, должны написать скрипт на perl или shell для загрузки источника базы данных tz периодически, чтобы поддерживать правила в актуальном состоянии.

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