View | Details | Raw Unified | Return to bug 9031
Collapse All | Expand All

(-)a/Koha/Calendar.pm (-17 / +11 lines)
Lines 317-348 sub days_between { Link Here
317
    my $start_dt = shift;
317
    my $start_dt = shift;
318
    my $end_dt   = shift;
318
    my $end_dt   = shift;
319
319
320
    if ( $start_dt->compare($end_dt) > 0 ) {
320
    # Change time zone for date math and swap if needed
321
        # swap dates
321
    $start_dt = $start_dt->clone->set_time_zone('floating');
322
        my $int_dt = $end_dt;
322
    $end_dt = $end_dt->clone->set_time_zone('floating');
323
        $end_dt = $start_dt;
323
    if( $start_dt->compare($end_dt) > 0 ) {
324
        $start_dt = $int_dt;
324
        ( $start_dt, $end_dt ) = ( $end_dt, $start_dt );
325
    }
325
    }
326
326
327
328
    # start and end should not be closed days
327
    # start and end should not be closed days
329
    my $days = $start_dt->delta_days($end_dt)->delta_days;
328
    my $days = $start_dt->delta_days($end_dt)->delta_days;
330
    for (my $dt = $start_dt->clone()->set_time_zone('floating');
329
    while( $start_dt->compare($end_dt) < 1 ) {
331
        $dt <= $end_dt;
330
        $days-- if $self->is_holiday($start_dt);
332
        $dt->add(days => 1)
331
        $start_dt->add( days => 1 );
333
    ) {
334
        if ($self->is_holiday($dt)) {
335
            $days--;
336
        }
337
    }
332
    }
338
    return DateTime::Duration->new( days => $days );
333
    return DateTime::Duration->new( days => $days );
339
340
}
334
}
341
335
342
sub hours_between {
336
sub hours_between {
343
    my ($self, $start_date, $end_date) = @_;
337
    my ($self, $start_date, $end_date) = @_;
344
    my $start_dt = $start_date->clone();
338
    my $start_dt = $start_date->clone()->set_time_zone('floating');
345
    my $end_dt = $end_date->clone();
339
    my $end_dt = $end_date->clone()->set_time_zone('floating');
346
    my $duration = $end_dt->delta_ms($start_dt);
340
    my $duration = $end_dt->delta_ms($start_dt);
347
    $start_dt->truncate( to => 'day' );
341
    $start_dt->truncate( to => 'day' );
348
    $end_dt->truncate( to => 'day' );
342
    $end_dt->truncate( to => 'day' );
Lines 351-357 sub hours_between { Link Here
351
    # take into account open/close times then it would be a duration
345
    # take into account open/close times then it would be a duration
352
    # of library open hours
346
    # of library open hours
353
    my $skipped_days = 0;
347
    my $skipped_days = 0;
354
    for (my $dt = $start_dt->clone()->set_time_zone('floating');
348
    for (my $dt = $start_dt->clone();
355
        $dt <= $end_dt;
349
        $dt <= $end_dt;
356
        $dt->add(days => 1)
350
        $dt->add(days => 1)
357
    ) {
351
    ) {
(-)a/t/db_dependent/Calendar.t (-2 / +3 lines)
Lines 68-80 is($forwarded_dt->ymd, $today->ymd, 'negative day should return start dt'); Link Here
68
68
69
subtest 'crossing_DST' => sub {
69
subtest 'crossing_DST' => sub {
70
70
71
    plan tests => 2;
71
    plan tests => 3;
72
72
73
    my $tz = DateTime::TimeZone->new( name => 'America/New_York' );
73
    my $tz = DateTime::TimeZone->new( name => 'America/New_York' );
74
    my $start_date = dt_from_string( "2016-03-09 02:29:00",undef,$tz );
74
    my $start_date = dt_from_string( "2016-03-09 02:29:00",undef,$tz );
75
    my $end_date = dt_from_string( "2017-01-01 00:00:00", undef, $tz );
75
    my $end_date = dt_from_string( "2017-01-01 00:00:00", undef, $tz );
76
    my $days_between = $calendar->days_between($start_date,$end_date);
76
    my $days_between = $calendar->days_between($start_date,$end_date);
77
    is( $days_between->delta_days, 298, "Days calculated correctly" );
77
    is( $days_between->delta_days, 298, "Days calculated correctly" );
78
    $days_between = $calendar->days_between($end_date,$start_date);
79
    is( $days_between->delta_days, 298, "Swapping returns the same" );
78
    my $hours_between = $calendar->hours_between($start_date,$end_date);
80
    my $hours_between = $calendar->hours_between($start_date,$end_date);
79
    is( $hours_between->delta_minutes, 298 * 24 * 60 - 149, "Hours (in minutes) calculated correctly" );
81
    is( $hours_between->delta_minutes, 298 * 24 * 60 - 149, "Hours (in minutes) calculated correctly" );
80
82
81
- 

Return to bug 9031