this is what I came up with, it will only work if you use the Gregorian
calendar
#!perl
use strict;
use warnings;
my $test1 = days_diff("Wed Oct 16 2002","Wed Oct 16 2001");
print $test1;
sub days_diff {
my @daysinmonth = (31,28,31,30,31,30,31,31,30,31,30,31);
my @month = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
my @day1 = split /\s/, shift;
my @day2 = split /\s/, shift;
my $ordinals; # array reference
foreach my $day (\@day1,\2) {
for my $mon (0..11) { # convert month name to number
$day->[1] = $mon if($day->[1] eq $month[$mon]);
}
my $ordinal = 000;
for my $mon (0..$day->[1]) {
my $lastday;
if ($mon == $day->[1]) {
$lastday = $day->[2];
} else {
$lastday = $daysinmonth[$mon];
$lastday += leapyear($day->[3]) if ($mon == 1); # adds extra
day in Feb for Leap Years
}
for my $days (1..$lastday) {
$ordinal++;
}
}
push @{$ordinals}, join($ordinal);
}
if ( $day1[3] == $day2[3]) {
return $ordinals->[1]-$ordinals->[0];
} elsif ($day1[3] < $day2[3]) {
my $total = $ordinals->[1];
$total += $day1[3].(365 + $day1[4]) - $ordinals->[0];
for my $year ($day1[3]+1..$day2[3]-1) {
$total += 365 + leapyear($year);
}
return $total;
} else {
my $total = $ordinals->[0] - ($day1[3].'000');
$total += $day2[3].(365 + $day2[4]) - $ordinals->[1];
for my $year ($day2[3]+1..$day1[3]-1) {
$total += 365 + leapyear($year);
}
return -$total;
}
}
sub leapyear {
my $year = shift;
return ((!($year % 4) && ($year % 100)) || !($year % 400));
}
TTYL
Joseph Jones
|