【问题标题】:Perl Datetime subtraction problemPerl 日期时间减法问题
【发布时间】:2011-08-16 06:46:27
【问题描述】:

我遇到了一个小问题,就是将两个 datetime 对象相减。我使用以下代码:


    $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 天。

我的减法有错误吗?

非常感谢您的帮助。

【问题讨论】:

    标签: perl datetime date subtraction


    【解决方案1】:

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

    【讨论】:

    • 不完全。 delta_days 仍然返回星期和天,所以你仍然需要使用 in_units。不同的是它不会返回月份,也不能转换为天。
    • 我已经通过一个 if 子句来检查它: if $sub->weeks > 0 then $days = $sub->weeks * 7 + $sub->days
    • 按照@ikegami 的建议使用$sub->in_units('days'),否则只要持续时间不超过一个月,您的解决方案就会起作用
    • @ikegami:感谢您指出这一点,我已经更新了答案。
    【解决方案2】:

    生成的持续时间为 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
    

    去掉前导零。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2022-11-14
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多