perl,int自1970年以来的秒数

前端之家收集整理的这篇文章主要介绍了perl,int自1970年以来的秒数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用旧版本的 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

猜你在找的Perl相关文章