tokuhirom's Blog

Date::Simple が local $ENV{TZ} をさしかえててタイムゾーンがかわっちゃう件

Date::Simple#format が内部で

local $ENV{TZ}='UTC+0';
POSIX::strftime(...);

のようにしており、Date::Simple#formatの呼出以後でタイムゾーンが UTC にかわってしまうという問題がよくしられている。

この問題は、そういえば最近は話題にあがらないなあ、とおもっていろいろ調べたところ、これは Perl 本体の issue と判断されて、perl 5.8.9 の時点で修正されていた。

On some systems, changes to C<$ENV{TZ}> would not always be
respected by the underlying calls to C<localtime_r()>.  Perl now
forces the inspection of the environment on these systems.

該当のコミットはこれ。 http://perl5.git.perl.org/perl.git/commitdiff/8572b25d

まとめると、local $ENV{TZ} を利用する場合には Perl 5.8.9 or later を依存として指定しておけばよいようだ。 (どうしてもそれ以下をサポートしたい場合は、明示的に tzset をよんで restore を明示的にかければいいけど無駄感ある)