5

2 つの 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 と今日の print ステートメントは次のように出力します。

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

しかし、減算後に値を印刷すると、 8日ではなく1$sub->daysと表示されます。

引き算に誤りはありますか?

助けてくれて本当にありがとうございます。

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

2 つの日付の差は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 に答える