Является ли Perl DateTime эпохой в миллисекундах или секундах? - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно сравнить временную метку, заданную моим бэкэндом (которая находится в Perl) и временную метку внешнего интерфейса (которая находится в JS), поэтому я должен быть уверен, что они обе используют одну и ту же единицу времени.

Для JS это просто, цитирование :

Число, представляющее миллисекунды , прошедшее с 1 января 1970 г. 00:00:00 UTC изаданная дата.

Для Perl документация о $dt->epoch() гласит:

Возвращает значение эпохи UTC для объекта datetime.Datetime до начала эпохи будет возвращено как отрицательное число.

Возвращаемое значение этого метода всегда целое число.

Поскольку эпоха не учитывает високосных секунд, эпохавремя для 1972-12-31T23: 59: 60 (UTC) точно такое же, как и для 1973-01-01T00: 00: 00.

Для меня не ясно, вернулось ли целое числов миллисекундах или секундах (во втором случае мне понадобится для преобразования эпохи JS в секундах или наоборот).

Какой из них правильный?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018
$ perl -MDateTime -wE 'say DateTime->new( year => 1971 )->epoch'
31536000
$ bc <<< 365*24*60*60
31536000
0 голосов
/ 20 сентября 2018

В контексте DateTime «эпоха» относится к Unix time , которое является количеством секунд, которые не являются високосными секундами с 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

Однако 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() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...