这似乎是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
对象。第二个参数是_mktime
应该解释为本地时间还是 UTC。当调用 as 时Time::Piece->strptime(STRING, FORMAT)
,ref($time)
将为 false,因此_mktime
将调用 with $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