日数計算

ふとある年月日から、ある年月日までの日数を知りたくなったので作成した。

hiduke.pl 1992/2/1 2005/6/14

とすると、

4882

とか返ってくる。


#!/usr/bin/perl -w
# hiduke.pl
# created:2005-06-11 22:41:33+09:00
#
#

use strict;

main {
my $first_date = $ARGV[0];
my $second_date = $ARGV[1];

my @first_array = split(/\//, $first_date);
my @second_array = split(/\//, $second_date);

my $result = &diff_days(@first_array, @second_array);

print "$result\n";

}
exit;

sub diff_days {
my ($first_year, $first_month, $first_day, $second_year, $second_month, $second_day) = @_;

my $year_day = 365;
my %month = (
1 => 0,
2 => 31,
3 => 59,
4 => 90,
5 => 120,
6 => 151,
7 => 181,
8 => 212,
9 => 243,
10 => 273,
11 => 304,
12 => 334,
);

my $second_year_day = $year_day + &leap_year($second_year);
my $first_year_day = $year_day + &leap_year($first_year);

my $second_keika = $second_day + $month{$second_month} + &check_leap($second_year, $second_month, $second_day);
my $first_keika = $first_day + $month{$first_month} + &check_leap($first_year, $first_month, $first_day);

my $sum_year = 0;

for my $year ($first_year+1..$second_year-1) {
$sum_year += &leap_year($year) + $year_day;
}

if ($first_year == $second_year ) {
return $second_keika - $first_keika;
} else {
return $sum_year + $second_keika + ($first_year_day - $first_keika);
}
}

sub check_leap {
my ($year, $month, $day) = @_;
if (&leap_year($year) == 1 && $month == 2 && $day == 29) {
return 1;
} elsif(&leap_year($year) == 1 && $month >= 3) {
return 1;
} else {
return 0;
}
}

sub leap_year {
my ($year) = @_;
if ($year % 400 == 0) {
return 1;
} elsif ($year % 100 == 0) {
return 0;
} elsif ($year % 4 == 0) {
return 1;
} else {
return 0;
}
}

# hiduke.pl ends here.

いろいろな年月日で試してみたが、あっているのかどうか不安。多分あっていると思うんだけど。