Perl Datetime проблема вычитания - PullRequest
5 голосов
/ 16 августа 2011

У меня есть небольшая проблема, вычитая два объекта даты и времени друг из друга. Я использую следующий код:


    $today = DateTime->now( time_zone => 'Europe/Berlin' );

    my $dt1 = DateTime-> new (
                     year => 2011,
                     month => 08,
                     day   => 08,
                     hour => 1,
                     minute => 0,
                     second => 4,
                     time_zone =>'Europe/Berlin'
                     );

    print "DT1 : $dt1\n";
    print "today: $today\n";

    my $sub = $today->subtract_datetime($dt1);

    print "sub days: ".$sub->days."\n";

Оператор печати для DT1 и сегодня печатает:

DT1 : 2011-08-08T01:00:04
today: 2011-08-16T08:34:10

Но если я вычитаю после вычитания значение $sub->days, оно показывает 1 вместо 8 дней.

Есть ли ошибка в моем вычитании?

Большое спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

DateTime::Duration не работает так, как вы (и я) ожидали.Отметьте все поля $sub:

DT1 : 2011-08-08T01:00:04
today: 2011-08-16T09:02:11
$sub->years: 0
$sub->months: 0
$sub->weeks: 1
$sub->days: 1
$sub->hours: 8
$sub->minutes: 2
$sub->seconds: 7

Разница между двумя датами составляет 1 неделя + 1 день , ожидаемые восемь дней.

Если вы хотите разницу в днях, попробуйте $today->delta_days( $dt1 ).Метод delta_days () возвращает продолжительность, которая содержит только дни (правка) и недели, но не месяцы.

0 голосов
/ 16 августа 2011

Итоговая продолжительность составляет 1 неделю и 1 день.Недели могут быть безопасно преобразованы в дни, поэтому вы можете получить желаемый результат, используя

$dur->in_units('days')

Имейте в виду, что месяцы не могут быть преобразованы в дни, и вычитание может привести к продолжительности с месяцами.Таким образом, вы действительно хотите использовать

my $dur = $today->delta_days($dt1);
print "sub days: ".$dur->in_units('days')."\n";

PS - 08 - ошибка:

Illegal octal digit '8' at a.pl line 7, at end of line
Illegal octal digit '8' at a.pl line 8, at end of line

Сброс начального нуля.

...