Является ли Perl DateTime эпохой в миллисекундах или секундах?

1

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

Для JS это легко, цитируя:

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

Для Perl в epoch() rel="nofollow noreferrer">документации по $dt->epoch() говорится:

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

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

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

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

Который правильный?

  • 2
    Разве вы не можете просто сделать одну и ту же дату на обоих языках и сравнить временные метки?
Теги:
datetime

2 ответа

7
Лучший ответ

В контексте DateTime "эпоха" относится к времени 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

Однако 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() );
6
$ perl -MDateTime -wE 'say DateTime->new( year => 1971 )->epoch'
31536000
$ bc <<< 365*24*60*60
31536000
  • 0
    Итак, каково решение?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню