2013-12-19 53 views
2

我已经在CentOS的6.3运行几个服务器和我所面临的问题是Perl模块的DateTime对待欧洲/莫斯科时间为UTC + 3perl的日期时间不正确时区偏移

[[email protected] ~]$ perl -MDateTime -e 'print DateTime->now()->set_time_zone("Europe/Moscow"), "\n";' 
2013-12-19T11:11:38 

,但实际上它是UTC + 4和系统像zdump或日期作业工具正确

[[email protected] ~]$ zdump Europe/Moscow 
Europe/Moscow Thu Dec 19 12:11:47 2013 MSK 

我的tzdata更新和DateTime模块,但它并没有帮助。 我该如何修改? 谢谢。

+0

你能检查日期时间/时区/欧洲/ Moscow.pm文件的内容(并通过[这一个]比较(https://metacpan.org/source/DROLSKY/DateTime-TimeZone-1.63/lib /DateTime/TimeZone/Europe/Moscow.pm))? – raina77ow

+1

有很多不同之处。似乎这是DateTime中的错误。我从CPAN安装了最后一个模块版本,而不是来自版本库的版本,问题已经消失。 – ulan

+0

虽然你的假设是正确的。我刚刚从你的链接(在另一台服务器上)替换了DateTime/TimeZone/Europe/Moscow.pm,它也可以工作。 – ulan

回答

3

那么,DateTime模块正在按照每个时区特定的TimeZone模块中指定的规则来发挥它的魔力。对于Europe/Moscow,模块是DateTime::TimeZone::Europe::Moscow。问题是所有的文件都是自动生成的,与特定版本的DateTime模块发布时存在的规则相对应。

在这种情况下,一个非常重要的变化 - 俄罗斯在2011年停止遵循DST程序 - 并未明显反映在该文件中。所以更新 - 无论是整个模块还是只有相关的TimeZone part - 都应该解决这个问题。

1

您可以使用您的系统tzfile(5),使用DateTime::TimeZone::Tzfile。它不仅比DateTime :: TimeZone更好地执行,还消除了需要同步冗余数据的需求。

$tz = DateTime::TimeZone::Tzfile->new('/etc/localtime'); 
$dt = DateTime->now(time_zone => $tz);