perl,int自1970年以来的秒数
发布时间:2020-12-16 06:05:53 所属栏目:大数据 来源:网络整理
导读:使用旧版本的 EPrints软件,我有这个函数EPrints :: Time :: datestring_to_timet返回自1970年以来的整数秒 ###################################################################### =pod =item $xhtml = EPrints::Time::datestring_to_timet( $handle,$dat
使用旧版本的
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,$mon-1,$year-1900; return $t; } 如果使用未来一年,我得到一个负数: print EPrints::Time::datestring_to_timet(undef,"3017-9-20T12:00:00Z"); 结果: -26895412800 这有什么不对? 解决方法
我认为这个包使用32位整数来表示秒.这是一个错误,因为它导致所谓的2038年问题 – 在2038年1月19日,自1970年1月1日以来的秒数达到231并且发生整数溢出.
实际上,由于你试图使用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |