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__

Reply via email to