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

e10*_*100 5 php perl timezone datetime dst

我正在开发一个世界时钟网络应用程序,我想添加一个功能来记录每个位置接下来将进行DST更改的方式和时间.

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

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

我的概念证明每分钟计算一次.我认为下一步是:

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

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

有任何想法吗?我应该注意到我对Perl的了解非常基础.


编辑:

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

dax*_*xim 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;
Run Code Online (Sandbox Code Playgroud)

我建议你提交一个错误来请求将这个API公开并记录下来,以便你的代码可以依赖它,并且DT维护者会正确地支持它.