Чтобы представить его как правильный ответ: Чтобы получить метку времени эпохи того же формата, который вы получаете от 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 секунд.