[Koha-bugs] [Bug 8486] New: Critical error in Koha::Calendar::days_between ?
bugzilla-daemon at bugs.koha-community.org
bugzilla-daemon at bugs.koha-community.org
Sat Jul 21 08:30:40 CEST 2012
http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=8486
Priority: P5 - low
Change sponsored?: ---
Bug ID: 8486
Assignee: colin.campbell at ptfs-europe.com
Blocks: 7420, 8251
Summary: Critical error in Koha::Calendar::days_between ?
Severity: blocker
Classification: Unclassified
OS: All
Reporter: paul.poulain at biblibre.com
Hardware: All
Status: ASSIGNED
Version: master
Component: Architecture, internals, and plumbing
Product: Koha
My setup has syspref finesCalendar set "Use Calendar to skip all days the
library is closed".
I made the small following script:
#!/usr/bin/perl
use Koha::Calendar;
use Koha::DateUtils;
use 5.010;
my $calendar = Koha::Calendar->new( branchcode => 'MAURES' );
say "Test 1=".$calendar->days_between(dt_from_string("2012-01-10") ,
dt_from_string("2012-05-05") )->in_units('days');
say "Test 2=".$calendar->days_between(dt_from_string("2012-05-05") ,
dt_from_string("2012-01-01") )->in_units('days');
The result I get is:
./test_calendar.pl
DURATION : $VAR1 = bless( {
'seconds' => 0,
'minutes' => 0,
'end_of_month' => 'wrap',
'nanoseconds' => 0,
'days' => 26,
'months' => 3
}, 'DateTime::Duration' );
Test 1=26
DURATION : $VAR1 = bless( {
'seconds' => 0,
'minutes' => 0,
'end_of_month' => 'preserve',
'nanoseconds' => 0,
'days' => -4,
'months' => -4
}, 'DateTime::Duration' );
Test 2=-4
(the DURATION line comes from a warn I put in days_between
Whatever the month, I always get the same result.
Digging into documentation, I found this:
$ perldoc DateTime::Duration
· in_units( ... )
Returns the length of the duration in the units (any of those that
can be passed to new) given as
arguments. All lengths are integral, but may be negative. Smaller
units are computed from what remains
after taking away the larger units given, so for example:
my $dur = DateTime::Duration->new( years => 1, months => 15 );
$dur->in_units( 'years' ); # 2
$dur->in_units( 'months' ); # 27
$dur->in_units( 'years', 'months' ); # (2, 3)
$dur->in_units( 'weeks', 'days' ); # (0, 0) !
The last example demonstrates that there will not be any conversion
between units which don't have a
fixed conversion rate. The only conversions possible are:
· years <=> months
· weeks <=> days
· hours <=> minutes
· seconds <=> nanoseconds
For the explanation of why this is the case, please see the How
Datetime Math Works section of the
DateTime.pm documentation
CONCLUSION = the days_between() sub is doing a completely wrong calculation. I
think we should to a date1-date2 to get a number of days, then remove all
closed days.
2012-07-01 to 2012-07-15 is 14 (days)
2012-07-06 closed => 13 (days)
2012-07-07 closed => 12 (days)
This problem is probably the real cause of bug 8251 and the trouble I get to
test bug 7420
Colin, I've assigned this bug to you because you're Koha::Calendar initial
author. Anyone is welcomed to confirm and provide a fix.
What is really missing is a test plan. With a strong one, we would have
detected the problem before
--
You are receiving this mail because:
You are watching all bug changes.
More information about the Koha-bugs
mailing list