Perl日期时间减法问题

5
我有一个小问题,需要从两个日期时间对象中相减。我使用以下代码:


    $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和today的打印语句输出如下:
DT1 : 2011-08-08T01:00:04
today: 2011-08-16T08:34:10

但是,如果我在减法后打印$sub->days值,它显示1而不是8天。

我的减法有错误吗?

非常感谢您的帮助。

2个回答

5
< p > 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天,预计为8天。

如果您想要以天为单位的差异,请尝试$today->delta_days( $dt1 )。 delta_days()方法返回仅包含天数 (编辑)和周数,但不包括月份。


3
不完全正确。 delta_days 仍然返回周和天数,因此仍需要使用 in_units。不同之处在于它不会返回无法转换为天数的月份。 - ikegami
我通过一个if语句来解决它:如果 $sub->weeks > 0,则 $days = $sub->weeks * 7 + $sub->days。 - JohnDoe
只需按照@ikegami建议的方式使用 $sub->in_units('days'),否则您的解决方案仅在持续时间不超过一个月时才能正常工作。 - Dimitar Petrov

0

结果持续时间为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

去掉前导零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接