我需要比较后端(在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,反之亦然)。
哪个是正确的?
答案 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