これはのバグのようTime::Piece->strptime(STRING, FORMAT)
です。問題のコードは次のとおりです。
sub strptime {
my $time = shift;
my $string = shift;
my $format = @_ ? shift(@_) : "%a, %d %b %Y %H:%M:%S %Z";
my @vals = _strptime($string, $format);
ここから始めましょう。_strptime
オペレーティングシステムのネイティブstrptime
関数です。それはどこにも文書化されていませんが、現地時間を返すように見えます。
# warn(sprintf("got vals: %d-%d-%d %d:%d:%d\n", reverse(@vals)));
return scalar $time->_mktime(\@vals, (ref($time) ? $time->[c_islocal] : 0));
さて、_mktime
メソッドを使用しての出力をオブジェクトに_strptime
変換しTime::Piece
ます。2番目のパラメーターは_mktime
、現地時間とUTCのどちらとして解釈するかです。として呼び出されるとTime::Piece->strptime(STRING, FORMAT)
、ref($time)
はfalseになるため、と_mktime
呼ばれます。$islocal=0
つまり_strptime
、UTC時刻を返します。これは間違っており、バグが見つかりました。(私はそれがどのように行われるべきかを知るためにC時間関数について十分に知りません。)
}
したがって、を使用する必要がありますlocaltime->strptime(STRING, FORMAT)
。ただし、古いバージョンのモジュールでは、別のバグが原因でこれが失敗します_mktime
(私のディストリビューションには、バージョン1.15が付属していますが、これはまだ壊れていますが、1.20で修正されています)。
に固有の奇妙な問題でもありません%s
。それはどんなTime::Piece->strptime
呼び出しでも起こります:
$ perl -MTime::Piece -E'say $x=Time::Piece->strptime("11 Dec 2012 10:00","%d %b %Y %H:%M")->epoch;say scalar localtime $x'
1355220000
Tue Dec 11 04:00:00 2012
$ perl -MTime::Piece -E'say $x=localtime->strptime("11 Dec 2012 10:00","%d %b %Y %H:%M")->epoch;say scalar localtime $x'
1355220000
Tue Dec 11 04:00:00 2012
$ export PERL5LIB=Time-Piece-1.20/blib/lib:Time-Piece-1.20/blib/arch
$ perl -MTime::Piece -E'say $x=Time::Piece->strptime("11 Dec 2012 10:00","%d %b %Y %H:%M")->epoch;say scalar localtime $x'
1355220000
Tue Dec 11 04:00:00 2012
$ perl -MTime::Piece -E'say $x=localtime->strptime("11 Dec 2012 10:00","%d %b %Y %H:%M")->epoch;say scalar localtime $x'
1355241600
Tue Dec 11 10:00:00 2012