Perl Datetime减法问题

时间:2011-08-16 06:46:27

标签: perl datetime date subtraction

通过从彼此中减去两个日期时间对象,我遇到了一些问题。我使用以下代码:


    $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 个答案:

答案 0 :(得分:5)

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()方法返回的持续时间仅包含(编辑)和周数,但不包含几个月。

答案 1 :(得分: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

放弃前导零。