gpt4 book ai didi

perl, int 自 1970 年以来的秒数

转载 作者:行者123 更新时间:2023-12-01 09:56:45 25 4
gpt4 key购买 nike

使用旧版本 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;
}

如果使用远在未来的一年,我得到一个负数:

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 包。它通过使用 float (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, int 自 1970 年以来的秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com