Разбор строки метки времени в целое число и вычитание метки времени найма - PullRequest
0 голосов
/ 23 января 2019

Впервые на Perl. У меня есть строка в следующем виде: 20190123120445, т. Е. ГГГГММДДЧЧМИСС. В perl, как вы превращаете это в метку времени, которую можно использовать для вычитания другой метки времени, сгенерированной из метки времени Time :: Hires. Я знаю, что временные метки имеют разное разрешение, и я предполагаю, что первая временная метка начинается с 0 мс.

Я могу превратить метку времени в объект DateTime, однако попытка вычесть значение таймера найма приведет к ошибке.

Как мне превратить первую строку в метку времени того же разрешения, что и метка времени, чтобы я мог вычесть значения и получить дельту? Или есть более очевидное решение?

use Time::Hires;
use Date::Parse;

my $parser = DateTime::Format::Strptime->new(
    pattern => '%Y%m%d%H%M%S',
    on_error => 'croak',
);

my $dt = $parser->parse_datetime($args->{EVENTCREATEDTIMESTAMP});
my $delta = time - $dt;

Если я пытаюсь сделать это, я получаю эту ошибку

Bad message vendor or subscription: Cannot subtract 1548265276 from a
DateTime object (DateTime=HASH(0x28e10d98)). Only a DateTime::Duration
or DateTime object can be subtracted from a DateTime object.

1 Ответ

0 голосов
/ 23 января 2019

Чтобы представить его как правильный ответ: Чтобы получить метку времени эпохи того же формата, который вы получаете от time, вызовите метод epoch для объекта DateTime. Вы можете легко вычесть временные метки эпохи, чтобы получить разницу в секундах, а затем преобразовать ее в более крупные номиналы. Time :: Seconds предоставляет полезные константы для этого, если вы предпочитаете.

use strict;
use warnings;
use Time::Seconds;
my $diff = time - $dt->epoch;
my $diff_hours = $diff / ONE_HOUR;

Если вам нужна разница в продолжительности календаря , все усложняется. Это потому, что не существует статического определения таких вещей, как «один месяц» или даже «один день» и «одна минута», из-за таких грубых вещей, как летнее время и дополнительные секунды. Таким образом, разница зависит от часового пояса и абсолютного времени начала и окончания. Самый простой способ справиться с этим - превратить вашу метку времени в объект DateTime, и пусть DateTime сделает всю работу за вас.

my $dt_time = DateTime->from_epoch(epoch => time);
# Each of the following returns DateTime::Duration objects with different measures of calendar time
my $diff_duration = $dt_time->subtract_datetime($dt); # months, days, minutes, seconds, nanoseconds
my $diff_days = $dt_time->delta_days($dt); # full days
my $diff_ms = $dt_time->delta_ms($dt); # minutes and seconds
my $diff_abs = $dt_time->subtract_datetime_absolute($dt); # seconds and nanoseconds

Отдельные компоненты результирующих объектов DateTime :: Duration можно получить с помощью метода in_units или путем передачи его в DateTime :: Format :: Duration . Метод subtract_datetime_absolute является единственным способом подсчета високосных секунд - временные метки фактически игнорируют их, и «минуты» других методов могут не иметь длину 60 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...