DateTime

 view release on metacpan or  search on metacpan

xt/author/pp-38local-subtract.t  view on Meta::CPAN

    );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months},      0, 'delta_months is 0' );
    is( $deltas{days},        0, 'delta_days is 0' );
    is( $deltas{minutes},     3, 'delta_minutes is 3' );
    is( $deltas{seconds},     0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    is(
        DateTime->compare( $dt1->clone->add_duration($dur), $dt2 ), 0,
        'subtraction is reversible'
    );
    is(
        DateTime->compare( $dt2->clone->subtract_duration($dur), $dt1 ), 0,
        'subtraction is doubly reversible'
    );
}

{
    my $dt1 = DateTime->new(
        year      => 2003, month  => 4, day => 5,
        hour      => 1,    minute => 58,
        time_zone => 'America/Chicago',
    );

    my $dt2 = DateTime->new(
        year      => 2003, month  => 4, day => 6,
        hour      => 3,    minute => 1,
        time_zone => 'America/Chicago',
    );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months},      0, 'delta_months is 0' );
    is( $deltas{days},        1, 'delta_days is 1' );
    is( $deltas{minutes},     3, 'delta_minutes is 3' );
    is( $deltas{seconds},     0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    is(
        DateTime->compare( $dt1->clone->add_duration($dur), $dt2 ), 0,
        'dt1 + dur = dt2'
    );

    # this are two examples from the docs
    is(
        DateTime->compare(
            $dt2->clone->subtract_duration($dur),
            $dt1->clone->add( hours => 1 )
        ),
        0,
        'dt2 - dur != dt1 (not reversible)'
    );
    is(
        DateTime->compare(
            $dt2->clone->subtract_duration( $dur->clock_duration )
                ->subtract_duration( $dur->calendar_duration ),
            $dt1
        ),
        0,
        'dt2 - dur->clock - dur->cal = dt1 (reversible when componentized)'
    );

    my $dur2    = $dt1->subtract_datetime($dt2);
    my %deltas2 = $dur2->deltas;
    is( $deltas2{months},       0, 'delta_months is 0' );
    is( $deltas2{days},        -1, 'delta_days is 1' );
    is( $deltas2{minutes},     -3, 'delta_minutes is 3' );
    is( $deltas2{seconds},      0, 'delta_seconds is 0' );
    is( $deltas2{nanoseconds},  0, 'delta_nanoseconds is 0' );
    is(
        $dt2->clone->add_duration($dur2)->datetime, '2003-04-05T02:58:00',
        'dt2 + dur2 != dt1'
    );
    is(
        DateTime->compare(
            $dt2->clone->add_duration( $dur2->clock_duration )
                ->add_duration( $dur2->calendar_duration ),
            $dt1
        ),
        0,
        'dt2 + dur2->clock + dur2->cal = dt1'
    );
    is(
        DateTime->compare( $dt1->clone->subtract_duration($dur2), $dt2 ), 0,
        'dt1 - dur2 = dt2'
    );

}

# These tests makes sure that days with DST changes are "normal" when
# they're the smaller operand
{
    my $dt1 = DateTime->new(
        year      => 2003, month  => 4, day => 6,
        hour      => 3,    minute => 1,
        time_zone => 'America/Chicago',
    );

    my $dt2 = DateTime->new(
        year      => 2003, month  => 4, day => 7,
        hour      => 3,    minute => 2,
        time_zone => 'America/Chicago',
    );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months},      0, 'delta_months is 0' );
    is( $deltas{days},        1, 'delta_days is 1' );
    is( $deltas{minutes},     1, 'delta_minutes is 1' );
    is( $deltas{seconds},     0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    my $dur2 = $dt1->subtract_datetime($dt2);

    my %deltas2 = $dur2->deltas;
    is( $deltas2{months},       0, 'delta_months is 0' );
    is( $deltas2{days},        -1, 'delta_days is -1' );
    is( $deltas2{minutes},     -1, 'delta_minutes is -1' );
    is( $deltas2{seconds},      0, 'delta_seconds is 0' );
    is( $deltas2{nanoseconds},  0, 'delta_nanoseconds is 0' );

}

{
    my $dt1 = DateTime->new(
        year      => 2003, month  => 4, day => 5,
        hour      => 1,    minute => 58,
        time_zone => 'America/Chicago',
    );

    my $dt2 = DateTime->new(
        year      => 2003, month  => 4, day => 7,
        hour      => 2,    minute => 1,
        time_zone => 'America/Chicago',
    );



( run in 0.618 second using v1.01-cache-2.11-cpan-ceb78f64989 )