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

时间:2010-10-14 21:45:04

标签: perl datetime

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

1061943540000

当我使用工具on this page时,它会将值转换为以下正确日期:

Tue Aug 26 2003 17:19:00 GMT-0700 (PDT)

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

use DateTime;
my $dt = DateTime->from_epoch(epoch => $time);

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

1969-12-31 23:59:59

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

1 个答案:

答案 0 :(得分:11)

这不是几秒钟的纪元时间。看起来它附加了几毫秒。这搞砸了DateTime使用的东西,这是自纪元以来的几秒钟。一般来说,Perl自上世纪以来就具有整秒的思维模式(见timelocaltimegmtime)。

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

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

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

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

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