I have a need to compute a year with fraction between two dates.

Meaning date 1 = 2005-05-04 date 2 = 2015-05-06 then the year I’m after is 
10.0054794520548.

My thinking on the above is neither 2005 or 2015 is a leap year so I should use 
a devisor of 365 days and the number of days extra between the above two dates 
is 2 so 2/365 is 0.0054794520548.

Based on the above thinking I need to determine two things to do the above 
generically.

1) what devisor to use 365 or 366 (depends on if either the start or end year 
is a leap year)

2) exactly how many days exist between the start date and end date minus all 
the extra years.

For item 1 using DateTime this is what I came up with:

 my $isMinLargerDayInYear;
 unless ($isMinLargerDayInYear=$min->month>$max->month) {
   if ($min->month==$max->month) {
     $isMinLargerDayInYear=$min->day>$max->day;
   }
 }
 my $isMinBeforeLeapDay=DateTime->new(year=>$min->year-1,month=>12,day=>31)
                                ->delta_days($min)->delta_days<60;
 my $isMaxPastLeapDay=DateTime->new(year=>$max->year-1,month=>12,day=>31)
                              ->delta_days($max)->delta_days>59;
 # determine if we should use 365 or 366 as divisor
 $yeardays=365;
 if (($min->is_leap_year && $max->is_leap_year) ||
     ($min->is_leap_year &&
      ($isMinBeforeLeapDay && ($isMaxPastLeapDay || $isMinLargerDayInYear))
     ) ||
     ($max->is_leap_year && $isMaxPastLeapDay)
    ) {
   $yeardays=366
 }

For item 2 using DateTime this is what I came up with:

my $days;
if ($min->is_leap_year) {
 $days=$min->delta_days(DateTime->new(year=>$min->year,month=>$max->month,
                                      day=>$max->day))->delta_days;
} else {
 if ($isMinLargerDayInYear) {
   $days=$max->delta_days(DateTime->new(year=>$max->year-1,month=>$min->month,
                                         day=>$min->day))->delta_days;
 } else {
   $days=$max->delta_days(DateTime->new(year=>$max->year,month=>$min->month,
                                        day=>$min->day))->delta_days;
 }
}

Then for the final value:

my $dur = $max - $min;
my $year = $dur->in_units(‘years’)+$days/$yeardays;

No idea how I would attempt to do the above to account for leap seconds but for 
anything I’m planning that level is not necessary.

Just wondering if I totally missed something that would make the above much 
easier in DateTime.

Thanks
Matthew

Reply via email to