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 和今天的打印语句打印:

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

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

我的减法有错误吗?

非常感谢您的帮助。

4

2 回答 2

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

于 2011-08-16T07:03:18.857 回答
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

去掉前导零。

于 2011-08-16T07:30:59.140 回答