#! /usr/local/bin/perl # # カレンダー (表形式の線なし)   # # id=calend.cgi # # update=00.8.11 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/calend.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi.html"; # 月末日 %max=(1,31,2,28,3,31,4,30,5,31,6,30,7,31,8,31,9,30,10,31,11,30,12,31); # 開始曜日 #%styb=(1,3,2,6,3,6,4,2,5,4,6,0,7,2,8,5,9,1,10,3,11,6,12,1); # 曜日 %yobi=(0,"日",1,"月",2,"火",3,"水",4,"木",5,"金",6,"土"); # 漢字の月と日 %tuki=(0,"0",1,"1",2,"2",3,"3",4,"4",5,"5",6,"6",7,"7",8,"8",9,"9",10,"10",11,"11",12,"12"); # 休日 %kyu=("0101",1,"0115",1,"0211",1,"0429",1,"0503",1,"0503",1,"0505",1,"0720",1,"0915",1,"0923",1,"1010",1,"1103",1,"1123",1,"1223",1); %kyn=("0101","元旦","0115","成人の日","0211","建国記念の日","0429","みどりの日","0503","憲法記念日","0505","こどもの日","0720","海の日","0915","敬老の日","0923","秋分の日","1010","体育の日","1103","文化の日","1123","勤労感謝の日","1223","天皇誕生日"); #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 今日の年月の保存 ($t1,$t2,$t3,$t4,$sysmm,$sysyy,$t7) = localtime; $sysmm++; # 年の4桁化 $sysyy = $sysyy + 1900; # 全体の流れを決定する(actionやpwdはフォーム入力されたデータを格納する名前) # action=check --> フォーム入力データのチェック処理へ # その他 --> フォーム入力画面へ if ($in{'action'} eq 'first') { &first; } elsif ($in{'action'} eq 'horiday') { &horiday; } elsif ($in{'action'} eq 'select') { &select; } elsif ($in{'action'} eq 'back') { &back; } elsif ($in{'action'} eq 'next') { &next; } else { &first; } ############################################# # # # 最初に表示する画面          # # # ############################################# sub first { # 本日セット ($t1,$t2,$t3,$t4,$mm,$yy,$t7) = localtime; $mm++; # 西暦4桁処理 $yy = $yy + 1900; # 祝日表示変数0セット $sw = 0; &display ; } ############################################# # # # カレンダーを表示する処理       # # # ############################################# sub display { # 指定月の開始曜日を得る &yobikeisan($yy,$mm); # 1日の曜日算出が失敗した場合 if ($sbmm != $mm) { &error(0); } $tk=$tuki{$mm}; print "Content-type: text/html\n\n"; print < カレンダー

  カレンダー


EOM print "

   $yy年 $tk月

"; print "
"; # 曜日の表示セット開始 for ($yb=0; $yb<=6; $yb++) { # 日曜日は赤、土曜は青にする if ($yb == 0) { print ""; print ""; print '"; } elsif ($yb == 6) { print '"; } else { print '"; } } # 曜日の表示セット終了 print ""; # wkは週 $dd=0; for ($wk=1; $wk<=6; $wk++) { # 0〜6までの曜日 for ($yb=0; $yb<=6; $yb++) { # 第一週の1日までの空白 if ($wk == 1) { if ($yb < $sy) { &kanjiday; } else { $dd++; &kanjiday; } } else { $dd++; if ($dd > $max{$mm}) { last ;} else { &kanjiday; } } # 表示セット # 祝祭日は赤(振替休日機能はない) # 2桁にする $mm2 = sprintf("%.2d",$mm); $dd2 = sprintf("%.2d",$dd); # 日曜日は赤にする if ($yb == 0) { print ""; print '"; } # 祝祭日も赤にする elsif ($kyu{$mm2.$dd2} eq 1) { print '"; } # 土曜日は青にする elsif ($yb == 6) { print '"; } else { # 平日判定 print '"; } # if 終了 } # 1週間表示後の改行 print ""; } # 最大6週間繰り返す print "
'."\n"; print ''."\n"; print $yobi{$yb}; print ''; print "'."\n"; print ''."\n"; print $yobi{$yb}; print ''; print "'."\n"; print ''."\n"; print $yobi{$yb}; print ''; print "
'."\n"; print ''."\n"; print $day; print ''; # 日曜日と祝日が重なった場合の処理 # 8/11 追加 if ($sw == 1 && $kyu{$mm2.$dd2} eq 1) { print '
'."\n"; print $kyn{$mm2.$dd2}; print ''; } # 祭日名表示 # 8/11 追加 ここまで print "
'."\n"; print ''."\n"; print $day; print ''; if ($sw == 1) { print '
'."\n"; print $kyn{$mm2.$dd2}; print ''; } # 祭日名表示 print "
'."\n"; print ''."\n"; print $day; print ''; print "'."\n"; print ''."\n"; print $day; print ''; print "
"; print '
'; # 祝祭日表示 if ($sw == 1) { $horiv="祝日名を消す"; } else { $horiv="祝日名表示"; } print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'. "\n"; # 年月指定 print '
' . "\n"; print '' . "\n"; print '' . "\n"; # 年 print ''. "\n"; # 月 print ''. "\n"; print '' . "\n"; print '
'. "\n"; print '
'; # 次月表示 print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'. "\n"; print '
 '; # 前月表示 print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'. "\n"; print '
 '; print '
' . "\n"; print '' . "\n"; print '
' . "\n"; print '
'; print ''. "\n"; } # end of &display ############################################ # # # 日を漢字の日に変換するサブルーチン # # # ############################################ sub kanjiday { # 1日前 if ($dd == 0) { $day = ""; } # 1桁は2文字の空白と漢字の数字 elsif ($dd < 10) { $day = "  ".$tuki{$dd}; } # 2桁は1文字の空白と漢字の数字 else { $day = " ".$tuki{substr($dd,0,1)}.$tuki{substr($dd,1,1)}; } } #end of kanjiday ########################################## # # # 選択年月表示処理         # # # ########################################## sub select { $yy=$in{'selyy'}; $mm=$in{'selmm'}; $sw=$in{'hori'}; # 表示 &display; exit; } ########################################## # # # 前月表示処理           # # # ########################################## sub back { # 年月受け渡し $yy=$in{'nen'}; $mm=$in{'tuki'}; $sw=$in{'hori'}; if ($mm == 1) { $yy--; $mm=12; } else { $mm--; } # チェック通過 &display; exit; } ########################################## # # # 次月表示処理           # # # ########################################## sub next { # 年月受け渡し $yy=$in{'nen'}; $mm=$in{'tuki'}; $sw=$in{'hori'}; if ($mm == 12) { $yy++; $mm=1; } else { $mm++; } # 表示 &display; exit; } ########################################## # # # 祝祭日表示処理          # # # ########################################## sub horiday { # 年月受け渡し $yy=$in{'nen'}; $mm=$in{'tuki'}; $sw=$in{'hori'}; # オンならオフ if ($sw == 1) { $sw = 0; } else { $sw = 1; } # 表示 &display; exit; } #############################################   # # # チェックエラー表示画面ルーチン     #  # #  ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = '計算エラー発生、指定月を表示することはできません。'; } print "Content-type: text/html\n\n"; print 'カレンダーの練習' . "\n"; print '

'; print '' . "\n"; print '

カレンダーの入力で下記のエラーが発生しました

' . "\n"; print '

'; print "$error_msg\n"; print '
'; # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '
'; print '入力の確認表示

' . "\n"; print '
'; print 'action: '.$in{'action'}.''."\n"; print '
'; print 'nen : '.$in{'nen'}.''."\n"; print '
'; print 'tuki: '.$in{'tuki'}.''."\n"; print '
'; print '

' . "\n"; exit; } ########################################## # # # $yyと$mmに年月をセットすると # $syにその月の曜日番号が戻される   # # # ########################################## sub yobikeisan { local($yy,$mm) = @_; local(@date); # ローカルタイムをとる ($t1,$t2,$t3,$mday,$mon,$year,$wday)=localtime; $mon++; $year = $year + 1900; # 表示する年月の曜日をとる # 年 $wkyy = $yy - $year; # 月 $wkmm = $mm - $mon; # その月の15日に移動する $wkdd = 15 - $mday; # 移動日数 $day = $wkyy * 365 + $wkmm * 30 + $wkdd; # 日時データを算出し、配列に格納 @date = localtime(time + $day * 60 * 60 * 24); $date[4]++; # 次にその日と曜日からその月の1日の曜日をだす ####### 削除個所 98.1.29 ########### ここから # 日を7で割、余りを求め、1を引く #$a=$date[3] / 7; #($seisu,$dummy)=split(/\./,$a); #$amari = $date[3] - 7 * $seisu; #$amari--; # 今日の曜日より余りが大きければ7を足す #if ($date[6] < $amari) { $sy = $date[6] - $amari + 7; } #else { $sy = $date[6] - $amari; } ####### 削除個所 98.1.29 ########### ここまでを消し # 指定日から1日までさかのぼりながら曜日を求める $sy=$date[6]; for ($i=$date[3]; $i>1; $i--) { # 曜日も1日前へここで0(日曜)より前になったら6(土曜)に戻る $sy--; if ($sy < 0) { $sy = 6 } } # end of for ####### 追加個所 98.1.29 ########### ここまでと入れ替える # 閏年の調整もする $a=$yy / 4; ($seisu,$syosu)=split(/\./,$a); if ($syosu == 0) { $max{2}=29; } # 返値 $sbmm=$date[4]; } ########################## end_of_script #################################