我应该如何确定Perl中时区的下一个夏令时(DST)转换?

时间:2010-07-14 12:47:28

标签: php perl datetime timezone dst

我正在开发一个世界时钟网络应用程序,我想添加一个功能来记录下一个位置接下来将如何进行DST更改。

我正在使用DateTimeDateTime::Timezone CPAN模块,它们似乎提供了除此之外的所有可能的功能! DateTime::Timezone是tz / Olson数据库的一个实现。

到目前为止,我正在将本地偏移量与UTC进行比较,无论是现在还是提前24小时,这样我就可以标记效果,但不确切地说它是什么时候。

我的概念验证每分钟计算一次。我想下一步是:

  • 使用类似的方法在接下来的365天内创建一个查找表,以确定受影响的日期,然后查看那些日期内的每个小时

  • 以某种方式解析DateTime::Timezone模块中的DST规则。

有什么想法吗?我应该注意到我对Perl的了解非常基础。


编辑:

看起来另一种选择可能是移植到PHP并使用DateTimeZone::getTransitions。这确实返回了一系列所有转换,但PHP 5.3.0只添加了可选的timestamp_begintimestamp_end参数来限制范围。

2 个答案:

答案 0 :(得分:9)

_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;

我建议你file a bug要求公开并记录此API,以便您的代码可以依赖它,并且DT维护者将正确支持它。

答案 1 :(得分:1)

您可以使用tz database

“公共域时区数据库包含代表全球许多代表性地点的当地时间历史的代码和数据。它会定期更新,以反映政治机构对时区边界,UTC偏移和夏令时规则。“

甚至还有一个perl模块。 “DateTime :: TimeZone包含一个脚本parse_olson,它将tz源代码编译成Perl模块。它是Perl DateTime项目的一部分,可以在GPL和Perl Artistic License下免费获得.DateTime :: TimeZone还包含一个脚本tests_from_zdump,为tz数据库中的每个时钟转换生成测试用例。“

正如您所说,您已经在使用此模块,但听起来您没有使用它的所有功能。我不确定通过DateTime :: TimeZone模块暴露了多少tz代码。在这种情况下,你可能最好不要打电话。有许多Web服务已经在使用tz数据库,因此使用得很好。

您可能应编写perl或shell脚本来下载tz数据库源代码 定期为了使规则保持最新。