Ответ 1
Сначала вам нужно сделать правильное вычитание. Существует delta_md
, delta_days
, delta_ms
и subtract_datetime_absolute
. В зависимости от того, какой блок вы хотите позже, вам нужно выбрать правильное вычитание. Проблема заключается в том, что не каждый блок может быть конвертирован позже без информации о времени. Именно поэтому вам нужно выбрать правильный метод дельта.
Например, в день может быть 23 часа или 24 или 25 часов, в зависимости от часового пояса. Из-за этого вам нужно указать, как должно выполняться вычитание. Поскольку вы хотите, чтобы дни спустя, вычитание нужно сосредоточить на днях, а сосредоточиться на часах. Не используйте функцию перегрузки, потому что она лучше всего подходит.
Это означает, что вам нужно выполнить вычитание delta_days
.
my $dur = $date->delta_days($today);
Теперь $dur является объектом DateTime::Duration
. Вы должны знать, что он всегда старается максимально соответствовать дням, неделям, годам, месяцам, если это возможно. Это означает, что ваши дни будут разделиться через недели и дни. Поскольку это преобразование всегда является константой.
Если вы не хотите, чтобы это "наилучшее соответствие", вам нужно вызвать метод in_units
и преобразовать его только в дни.
my $days = $dur->in_units('days');
Но, как я уже говорил, in_units
может сделать конверсию там, где это возможно. Вызов с in_units('hours')
не будет работать на этом объекте и просто вернуть ноль, потому что вы не можете конвертировать дни в часы. Например, если вам нужны часы, вам нужно сделать delta_ms
, и на этом объекте вы можете вызвать in_units('hours')
Полный пример:
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
use DateTime;
use DateTime::Format::Strptime;
my $date = "23/05-2022";
my $parser = DateTime::Format::Strptime->new(
pattern => '%d/%m-%Y',
time_zone => 'local',
);
$date = $parser->parse_datetime($date);
my $today = DateTime->new(
day => 1,
month => 7,
year => 2011,
time_zone => 'local'
);
my $dur = $date->delta_days($today);
say "Weeks: ", $dur->weeks;
say "Days: ", $dur->days;
say "Absolute Days: ", $dur->in_units('days');
say "Absolute Hours: ", $date->delta_ms($today)->in_units('hours');
Выход этой программы:
Weeks: 568
Days: 3
Absolute Days: 3979
Absolute Hours: 95496
И только для информации:
1) Вам не нужно загружать DateTime::Duration
, чтобы его загрузили с помощью DateTime
.
2) Вам не нужно(). Эти модули являются ООП и не экспортируют и не импортируют ничего.