It seems that I've found where things are going wrong. DateTime must
have gone from MSB to LSB math.
When you ask me to subtract 1 month, 14 days from something, I'd take
off the month first. MSB. And (if my tests used to work, which I know
they did) must have been the way DT:D used to work.
However, the current distro evidently works the other way and subtracts
the days and THEN the months. Attached is a test script that shows the
problem.
This is not a bug as must as an unexpected behaviour. I wonder if
there's some way to allow the user to choose the behaviour?
$datetime->add_lsb() and $datetime->add_msb()? (as well as choosing one
as the default for simple $datetime->add() and for the overloads)
Cheers!
Rick Measham
use DateTime;
use DateTime::Duration;
my $dt1 = new DateTime( year => 2004, time_zone => 'Australia/Melbourne' );
my $dt2 = new DateTime( year => 2004, time_zone => 'Australia/Melbourne' );
my $dtd1 = new DateTime::Duration( days => -45 );
# dt1 is currently 2004-01-01T00:00:00
# December has 31 full days, which leaves 14 from our 45
# November has 30 days, so subtracting those 14 should leave us at
2004-11-17T00:00:00
# 14 full days of November: 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30
# 1 2 3 4 5 6 7 8 9 10 11
12 13 14
my $dtd2 = new DateTime::Duration( months => -1, days => -14 );
# Once again, we subtract December, this time it's our 'one month'
leaving us to
# subtract 14 days from November
$dt1 = $dt1 + $dtd1;
$dt2 = $dt2 + $dtd2;
print "DT1: ".$dt1->datetime."\n";
# DT1: 2003-11-17T00:00:00
print "DT2: ".$dt2->datetime."\n\n";
# DT2: 2003-11-18T00:00:00
# So what went wrong? I'm guessing we're starting with the most
significant bit
# rather than the least-significant.
# 2004-01-01T00:00:00 - 14 days:
my $dt3 = new DateTime( year => 2004, time_zone => 'Australia/Melbourne' );
my $dtd3 = new DateTime::Duration( days => -14 );
$dt3 = $dt3 + $dtd3;
print "DT3a: ".$dt3->datetime."\n\n";
# DT3a: 2003-12-18T00:00:00
# Now subtract 1 month from that and you get November 18th.
__END__