5

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

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

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

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

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

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

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


编辑:

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

4

2 回答 2

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;

我建议您提交一个错误以请求将此 API 公开并记录在案,以便您的代码可以依赖它,并且它将得到 DT 维护人员的适当支持。

于 2010-07-14T13:07:47.003 回答
1

您可以使用tz 数据库

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

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

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

您可能应该编写一个 perl 或 shell 脚本来定期下载 tz 数据库源,以使规则保持最新。

于 2010-08-11T02:58:51.950 回答