#!/usr/bin/perl # 簡易型 万年カレンダー # by CGI-RESCUE # 2005.4.22 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $year += 1900; @days = ('',31,'',31,30,31,30,31,31,30,31,30,31); @pairs = split(/&/,$ENV{'QUERY_STRING'}); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge; $value =~ s///g; $value =~ s/\r//g; $value =~ s/\n//g; $in{$name} = $value; } #書式チェック if ($in{'year'} > 1582 && ($in{'year'} =~ /^\d\d\d\d$/) && ($in{'month'} >= 1 && $in{'month'} <= 12)) { &calendar($in{'year'},$in{'month'}); } else { &calendar($year,$mon + 1); } sub calendar { local($Year,$Month) = @_; print "Content-type: text/html; charset=Shift_JIS\n\n"; print "\n"; print "\n"; print "万年カレンダー\n"; print "\n"; print "\n"; print "\n"; print "\n"; $yr = $Year; $rev = $Month - 1; if ($rev == 0) { $rev = 12; $yr --; } if ($yr > 1582) { # 1583年以降 print "\n"; } print "\n"; $yr = $Year; $ff = $Month + 1; if ($ff == 13) { $ff = 1; $yr ++; } print "\n"; print "\n"; print "\n"; foreach $i (@wday_array){ print "\n"; } # 曜日 print "\n"; ($wday) = &getwday($Year,$Month,1); # $Year年$Month月1日の曜日 兼 2月の日数調査 foreach $Day (1 .. $days[$Month]) { # $Year年$Month月の日数分繰り返し if ($Day == 1) { print "\n"; if ($wday != 0) { foreach (1 .. $wday) { print "\n"; } } #月頭のブランクを埋める } elsif ($wday == 0) { print "\n"; } # 週頭 if ($Year == $year && $Month == $month && $Day == $mday) { $b1 = ""; $b2 = ""; } else { $b1 = $b2 = ""; } print "\n"; # 日付 if ($Day == $days[$Month]) { foreach (1 .. 6 - $wday) { print "\n"; } #月末ブランクを埋める } $wday ++; if ($wday == 7) { print "\n"; $wday = 0; } # 横軸を閉じる } print "
$Year年$Month月
$i
 
$b1$Day$b2 
\n"; } print "\n"; #曜日判定 sub getwday { local ($year,$month,$day) = @_; local ($base,$i); #2月の日数(うるう年の判定) $days[2] = 28; unless ($year % 4) { $days[2] = 29; } unless ($year % 100) { $days[2] = 28; } unless ($year % 400) { $days[2] = 29; } #Zeller(ツェラー)の公式 ... 1582年10月15日以降有効 $base = (($year - 1) * 365) + int(($year - 1) / 4) - int(($year - 1) / 100) + int(($year - 1) / 400); #そこへ該当年の日数を加算 $i = $month; while ( --$i ) { $base += $days[$i]; } #1週間7日で除算した余りが曜日 ... 0なら日曜、1なら月曜 ... 6なら土曜。 return ($base + $day) % 7; }