Date::Handler でも9時間ズレる!POSIX::strftime に注意

Date::Simple で9時間ズレる問題(2131) - TokuLog! で取り上げられていた、POSIX::strftime を用いたときの時間ずれ問題。

僕は Date::Simple をもっと拡張した感じの Date::Handler ってモジュールで同様の経験をしました。

- スポンサーリンク -

Apache + mod_perl な環境で、Apache のログやデータベース内の登録日が 'UTC' (9時間前)になってしまって原因特定にスゴイ時間がかかったのを覚えています。結局その時は、Date::Handler を 'JST-9' 限定な感じで patch を当てて使って事なきを得たのですが、TokuLog! さんの記事を見て、

とかなってるわけですよ。$ENV{TZ} とか変えてる。local 使ってるから環境変数は元に戻るんだけど、POSIX::strftime の中で tzset されているらしく、環境変数は戻っても tzname は元に戻らない様子。

とまでは解析できず、今更ながらなるほどぉ〜そうすれば良かったんだ。と思いました。

Date::Handler は Date::Simple よりも POSIX::strftime を多用しています。

local $ENV{'TZ'} = $self->TimeZone();
local $ENV{'LC_TIME'} = $self->Locale(); return strftime(ほげほげ);

となっている部分を全て書き換えるのもメンドウなので、

sub _strftime {
my $tz = $ENV{TZ}; local $ENV{'TZ'} = $self->TimeZone();
local $ENV{'LC_TIME'} = $self->Locale(); my $data = strftime(@_);
$ENV{'TZ'} = $tz || '';
$ENV{'LC_TIME'} = $tz || '';
POSIX::tzset();
return $data;
}

なんてプライベート関数を用意して、strftime を _strftime に置換すれば良い感じ。不具合の原因発見に一週間くらいかかってぐったりした記憶が蘇りました。

Perl Best Practices
Perl Best Practices
posted with amazlet on 05.10.22
Damian Conway
Oreilly & Associates Inc (2005/08)
売り上げランキング: 15,910
5 仮にもPerlで飯を食っている人間は、本書に書いてあることは守らぬまでも
抑えておく必要があるだろう・・・
- スポンサーリンク -