使用旧版本的EPrints软件,我有这个函数 EPrints :: Time :: datestring_to_timet返回自1970年以来的整数秒
######################################################################
=pod
=item $xhtml = EPrints::Time::datestring_to_timet( $handle, $datevalue )
Returns an interger number of seconds since 1970-01-01:00:00
$datevalue - in the format YYYY-MM-DDTHH:MM:SSZ
=cut
######################################################################
sub datestring_to_timet
{
my( $session, $datevalue, $short ) = @_;
my( $year,$mon,$day,$hour,$min,$sec ) = split /[- :TZ]/, $datevalue;
my $t = timegm_nocheck $sec||0,$min||0,$hour,$day,$mon-1,$year-1900;
return $t;
}
Run Code Online (Sandbox Code Playgroud)
如果使用未来一年,我得到一个负数:
print EPrints::Time::datestring_to_timet(undef, "3017-9-20T12:00:00Z");
Run Code Online (Sandbox Code Playgroud)
结果:
-26895412800
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
我认为这个包使用32位整数来表示秒.这是一个错误,因为它导致所谓的2038年问题 - 在2038年1月19日,自1970年1月1日以来的秒数达到2 31并且整数溢出发生.
实际上,由于你试图使用3017年,这种溢出发生了很多次(每68年一次).
此问题的典型解决方法是使用64位数字表示秒.
另一种可能性是你使用旧的32位Perl.升级到64位Perl(与您的软件包一起)可能会自行修复它.
或者,您可以使用包DateTime.它通过使用浮点数(53位)支持甚至在32位Perl上足够大的时间戳.
$ perl -V:ivsize
ivsize='4';
$ perl -MDateTime::Format::RFC3339 -E'
say DateTime::Format::RFC3339
->parse_datetime("3017-09-20T12:00:00Z")
->epoch'
33062817600
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
81 次 |
最近记录: |