jus*_*rld 2 javascript perl datetime
我需要比较我的后端(在Perl中)给出的时间戳和前端的时间戳(在JS中),所以我需要确保它们都使用相同的时间单位.
对JS来说很简单,引用:
一个数字,表示1970年1月1日00:00:00 UTC与给定日期之间经过的毫秒数.
对于Perl中,该文件约$dt->epoch()说:
返回datetime对象的UTC纪元值.在纪元开始之前的日期时间将作为负数返回.
此方法的返回值始终为整数.
由于该纪元不考虑闰秒,因此1972-12-31T23:59:60(UTC)的纪元时间与1973-01-01T00:00:00的纪元时间完全相同.
对我来说,不清楚返回的整数是以毫秒还是秒为单位(在第二种情况下,我需要在几秒钟内转换JS纪元或反之亦然).
哪一个是正确的?
在DateTime的上下文中,"epoch"指的是Unix时间,它是自1970-01-01T00:00:00Z以来的秒数.
$ 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
Run Code Online (Sandbox Code Playgroud)
但是,DateTime支持分辨率为纳秒的时间,因此您可以使用以下内容来获取JavaScript时间戳.
my $js_time = $dt->epoch * 1000 + $dt->millisecond;
Run Code Online (Sandbox Code Playgroud)
当然,为毫秒组件获取非零值假定DateTime对象是在足够精确的时间内创建的.事实并非如此
my $dt = DateTime->now();
Run Code Online (Sandbox Code Playgroud)
因为它使用time运算符来获取当前时间.要获得更高分辨率的时间戳,您可以使用以下内容:
use Time::HiRes qw( time );
my $dt = DateTime->from_epoch( epoch => time() );
Run Code Online (Sandbox Code Playgroud)
$ perl -MDateTime -wE 'say DateTime->new( year => 1971 )->epoch'
31536000
$ bc <<< 365*24*60*60
31536000
Run Code Online (Sandbox Code Playgroud)