そのまんまの内容ですがこういうものが簡単に見つからなかったので。新人の課題みたいだ。
ヘルプというのもおこがましいですが、説明項目などをこちらに追記していきます。
ある月が何曜日から始まるかについては、公式を利用した日付から曜日を調べるを参考にしました。コードとしては以下。ある月の1日の曜日を調べてます。おそらくlocaltime(timelocal)の方が遅いだろうけど、まあ、ちょっと残しています。
sub calc_first_week($$){
my ($y, $m) = @_;
die "invalid month $m" if ($m < 1 or 12 < $m);
return @{[ localtime(timelocal(0,0,0,1,$m-1,$y-1900)) ]}[6] if 1970 < $y and $y < 2038;
my $d = 1;
if ($m < 3){
$y -= 1;
$m += 12;
}
my $c = int($y / 100);
my $ly = $y % 100;
my $r = int(21 * $c / 4) + int(5 * $ly / 4) + int(26 * ($m + 1) /10 ) + $d - 1;
return $r % 7;
}
うるう年に関しては400で割ったり100で割ったり4で割ったりして調べています。公式じゃなくて手計算。多分正しいと思う。こんなん。
sub calc_days_in_month($$){
my ($y, $m) = @_;
die "invalid month $m" if ($m < 1 or 12 < $m);
return 30 if $m == 4 or $m == 6 or $m == 9 or $m == 11;
return 31 if $m == 1 or $m == 3 or $m == 5 or $m == 7 or $m == 8 or $m == 10 or $m == 12;
# feb
return 29 if $y % 400 == 0;
return 28 if $y % 100 == 0;
return 29 if $y % 4 == 0;
return 28;
}