Hi Todd, Todd Goldenbaum wrote: > Hello, > > I'm trying to find the difference betwen two datetime > objects, but I'm > getting some unexpected results. I start with two dates out of mysql > (code simplified a bit for this example): > > my $start_date = DateTime::Format::MySQL->parse_date( '2005-01-05' > ); my $end_date = DateTime::Format::MySQL->parse_date( > '2005-01-23' ); > > Then I use one of these two techniques to perform the subtraction: > > my $duration = $start_date->delta_days( $end_date ); > > my $duration = $end_date - $start_date; > > Expecting to get a $duration of 18 days. But with either technique, > the resulting $duration->days value is 4 instead of the expected 18. > And when I ask for $duration->hours, it gives me 0. > > Further experimentation with the two dates involved reveals that > subtracting two dates that are within a few days of each > other seems to > work, but at a certain point it breaks down and gives erroneous > results. Any idea what could be going on here? > > Thanks, > Todd There are a couple of ways to do this; use strict; use warnings; use DateTime; use DateTime::Format::MySql;
my $start_date = DateTime::Format::MySQL->parse_date( '2005-01-05' ); my $end_date = DateTime::Format::MySQL->parse_date( '2005-01-23' ); my $dur = $end_date->delta_days( $start_date ); print $dur->delta_days; gives the correct result of 18 or using your example above my $duration = $end_date - $start_date; print $duration->in_units('days'); gives the same results. However, after checking the docs for this function. I found this: The C<delta_md> and C<delta_days> methods truncate the duration so that any fractional portion of a day is ignored. The C<delta_ms> method converts any day and month differences to minutes. Unlike the subtraction methods, B<these methods always return a positive (or zero) duration>. ^^^^^^^^^^^^^^^^^^^^^^^^^^^ but if I do thisuse strict; use warnings; use DateTime; use DateTime::Format::MySql; my $start_date = DateTime::Format::MySQL->parse_date( '2005-01-05' ); my $end_date = DateTime::Format::MySQL->parse_date( '2005-01-23' ); my $dur = $start_date->delta_days( $end_date ); if ($dur->is_positive) {print "it's positive\n"} if ($dur->is_negative) {print "it's negative\n"} print $dur->delta_days; I get this: F:\scripts>my.pl it's negative -18 Which is correct but does not match what the docs say. Anyway I hope this helps. Ron Hill