Perl DateTime的纪元是毫秒还是秒?

时间:2018-09-20 14:37:21

标签: javascript perl datetime

我需要比较后端(在Perl中)和前端(在JS中)给定的时间戳,因此我需要确保它们都使用相同的时间单位。 / p>

对于JS,quoting很简单:

  

一个数字,表示世界标准时间1970年1月1日00:00:00与给定日期之间的毫秒

对于Perl,关于$dt->epoch()的{​​{3}}说:

  

返回datetime对象的UTC纪元值。纪元开始之前的日期时间将以负数返回。

     

此方法的返回值始终是整数。

     

由于纪元不计leap秒,因此1972-12-31T23:59:60(UTC)的纪元时间与1973-01-01T00:00:00的纪元时间完全相同。

对我来说,不清楚返回的整数是毫秒还是秒(在第二种情况下,我需要documentation,反之亦然)。

哪个是正确的?

2 个答案:

答案 0 :(得分:7)

在DateTime的上下文中,“历元”是指Unix time,它是自1970-01-01T00:00:00Z以来不leap秒的秒数。

$ perl -MDateTime -e'CORE::say DateTime->from_epoch( epoch => 1 )'
1970-01-01T00:00:01

$ perl -MDateTime -e'CORE::say DateTime->from_epoch( epoch => 1000 )'
1970-01-01T00:16:40

但是,DateTime支持具有纳秒级分辨率的时间,因此您可以使用以下内容获取JavaScript时间戳。

my $js_time = $dt->epoch * 1000 + $dt->millisecond;

当然,如果要获得毫秒部分的非零值,则假定创建的DateTime对象具有足够精确的时间。

并非如此
my $dt = DateTime->now();

因为它使用time运算符来获取当前时间。要获得更高分辨率的时间戳,可以使用以下命令:

use Time::HiRes qw( time );

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

答案 1 :(得分:6)

$ perl -MDateTime -wE 'say DateTime->new( year => 1971 )->epoch'
31536000
$ bc <<< 365*24*60*60
31536000