为什么Perl的DateTime-> from_epoch返回1969-12-31 23:59:59?

Rus*_* C. 1 perl datetime

我们正在处理API的数据,该API返回以下格式的日期/时间值:

1061943540000
Run Code Online (Sandbox Code Playgroud)

当我在此页面上使用该工具时,它将值转换为以下正确日期:

Tue Aug 26 2003 17:19:00 GMT-0700 (PDT)
Run Code Online (Sandbox Code Playgroud)

我们使用以下Perl代码来转换脚本中的日期/时间:

use DateTime;
my $dt = DateTime->from_epoch(epoch => $time);
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下不正确的输出:

1969-12-31 23:59:59
Run Code Online (Sandbox Code Playgroud)

我完全搞砸了为什么这不起作用,并希望有人解释我做错了什么以及我应该使用什么代码来正确转换它.提前致谢!

bri*_*foy 11

这不是几秒钟的纪元时间.看起来它附加了几毫秒.这搞砸了DateTime使用的东西,这是自纪元以来的几秒钟.Perl中,一般地,具有从epoch整个秒(见心态时间,本地时间,gmtime的).

如上所述,你得到一个遥远的时间.我可能会得到一个与你不同的日期,因为我的Perl是64位且具有Y2038修复:

$ perl -MDateTime -E 'say DateTime->from_epoch( epoch => shift() )' 1061943540000
35621-08-26T04:40:00
Run Code Online (Sandbox Code Playgroud)

除以1000为您提供正确的日期,但在UTC中:

$ perl -MDateTime -E 'say DateTime->from_epoch( epoch => shift() / 1000 )' 1061943540000   
2003-08-27T00:19:00
Run Code Online (Sandbox Code Playgroud)

如果你回到你的在线Java工具,你会注意到它给你1061943540000和1061943540的相同日期.它猜测一个是毫秒.这也意味着如果1061943540以毫秒为单位,它会给出错误的日期.

  • 只是为了澄清,它没有溢出,因为"DateTime无法处理亚秒级"或类似的东西 - 当你给它一些毫秒时溢出,但让它认为它是几秒钟而不是:) (3认同)