Как мне определить следующий переход на летнее время (DST) для часового пояса в Perl?

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

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

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

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

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

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

Любые идеи? Я должен отметить, что мои знания Perl довольно базовые.


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

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


person e100    schedule 14.07.2010    source источник
comment
Еще один вариант, который вы, возможно, захотите рассмотреть, если вы работаете в Linux, — это вывод команды zdump. Например: zdump -v America/New_York   -  person Grant McLean    schedule 10.08.2010
comment
Спасибо за часть редактирования!   -  person Alex    schedule 28.10.2013


Ответы (2)


Недокументированный атрибут _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.

person daxim    schedule 14.07.2010
comment
Интересный! Я обязательно зарегистрирую ошибку. - person e100; 14.07.2010
comment
Я зарегистрировал ошибку, но из ответа я понял, что это часть внутренней работы и не предназначено для разоблачения. Я постараюсь узнать больше и обновить здесь. - person e100; 29.07.2010
comment
См. timeanddate.com/time/dst2010.html. В некоторых странах может измениться время перехода на летнее время. наблюдается, объявив об изменении всего за несколько недель до этого. Максимальная точность не может быть достигнута с помощью решения на основе экспертной системы (например, базы данных). Но решение daxim должно быть хорошим для большинства случаев. - person jmz; 06.08.2010
comment
Вот отчет об ошибке и ответ: rt.cpan.org/Public/Bug /Display.html?id=59405 - person e100; 09.08.2010

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

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

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

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

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

person hookenz    schedule 11.08.2010
comment
Это просто копирование и вставка, которая повторяет примечания в моем вопросе. - person e100; 11.08.2010