{menubar:nest2menu=nestedsidemenu,310}
初級編>祝日を判定する(番外編)
マークは、解説つきです。(クリックしてね)

今度は、カレンダーに祝日を設定しましょう。

行政歴史研究会 さんの 休日変遷一覧 を参考にさせていただきました。

いや~~ほんとに、インターネットって便利ですねえ。
ところが・・・。カレンダーのプログラムのチェックをしていたら、8月11日(山の日)がない!!!
再度、ネット検索。
最終的に、 ウィキペディア 国民の祝日 で以下の表を追加修正。(2017年1月19日)
祝日 公布日 S23.7.20 S41.6.25 H1.2.17 H8.1.1 H12.1.1 H15.1.1 H19.1.1
1月1日 元日 元日 元日 元日 元日 元日 元日
1月第2月曜日 成人の日 成人の日 成人の日
1月15日 成人の日 成人の日 成人の日 成人の日
2月11日 建国記念の日 建国記念の日 建国記念の日 建国記念の日 建国記念の日 建国記念の日
春分日 春分の日 春分の日 春分の日 春分の日 春分の日 春分の日 春分の日
4月29日 天皇誕生日 天皇誕生日 みどりの日 みどりの日 みどりの日 みどりの日
5月3日 憲法記念日 憲法記念日 憲法記念日 憲法記念日 憲法記念日 憲法記念日 憲法記念日
5月4日 みどりの日
5月5日 こどもの日 こどもの日 こどもの日 こどもの日 こどもの日 こどもの日 こどもの日
7月第3月曜日 海の日 海の日
7月20日 海の日 海の日
8月11日 山の日;
9月第3月曜日 敬老の日 敬老の日
9月15日 敬老の日 敬老の日 敬老の日 敬老の日
秋分日 秋分の日 秋分の日 秋分の日 秋分の日 秋分の日 秋分の日 秋分の日
10月第2月曜日 体育の日 体育の日 体育の日
10月10日 体育の日 体育の日 体育の日
11月3日 文化の日 文化の日 文化の日 文化の日 文化の日 文化の日 文化の日
11月23日 勤労感謝の日 勤労感謝の日 勤労感謝の日 勤労感謝の日 勤労感謝の日 勤労感謝の日 勤労感謝の日
12月23日 天皇誕生日 天皇誕生日 天皇誕生日 天皇誕生日 天皇誕生日

春分の日と秋分の日の求め方は、以下のとおりです。
これも、インターネットで検索して見つけました。某掲示板でした。
|| ----引用開始
|| 日付の求め方
|| 春分の日(3月xx日)
||       1851-1899       [19.8277 + 0.242194*(年-1980)-[(年-1983)/4]]
||       1900-1979       [20.8357 + 0.242194*(年-1980)-[(年-1983)/4]]
||       1980-2099       [20.8431 + 0.242194*(年-1980)-[(年-1980)/4]]
||       2100-2150       [21.8510 + 0.242194*(年-1980)-[(年-1980)/4]]
|| 秋分の日(9月xx日)
||       1851-1899       [22.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
||       1900-1979       [23.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
||       1980-2099       [23.2488 + 0.242194*(年-1980)-[(年-1980)/4]]
||       2100-2150       [24.2488 + 0.242194*(年-1980)-[(年-1980)/4]]
||
||       ※[n]はガウス記号で,nの小数部を捨てた整数部.
|| ----引用終了
なお、正確には、春分の日および秋分の日は官報で告示された日なので、 ひょっとすると違う場合もありえます。
以上が国民の祝日です。 また、休日というのがあります。 ご存知のように振り替え休日というものですね。祝日が日曜日なら月曜日が休日になります。
もうひとつ、「国民の祝日に関する法律」の第3条第3項に その前日及び翌日が「国民の祝日」である日(日曜日にあたる日及び前項に規定する休日にあたる日を除く。)は、休日とする。
というのがあり、毎年、5月4日が該当します。
上記の条件をスクリプトに表すわけですが、どんな風にすればいいのでしょうか。
春分の日や秋分の日は計算で日にちが出るので、まあ忠実に置き換えていけばいいと思います。 それ以外の祝日は、ある年から、第2月曜日だとか第3月曜日なんかに変更されているものがあったり 、昔どおり決まった日にちだったりいろいろです。 う~ん。どうしようか悩みますねえ。
私は、表示する月が1か月分なので最大日数の31日分の配列変数に 休日だったら1、それ以外だったら0(というか何も代入しない)を 代入することで、その日にちが休日かどうか判断できると考えました。 そういう考えから出来たサブルーチンが以下のとおりです。
##############
# 祝日の設定 #
##############
sub syukujitu_settei {
# サブルーチンで使用する変数を指定する。
  my($year,$month);
# 呼び出された時の、引数を受け取る
  $year  = @_[0];
  $month = @_[1];
  if ($year >1948) {
    if ($month ==  1) {$syukujitu[1]  = 1;
      if ($year < 2000)  {$syukujitu[15] = 1;}
      } elsif ($month ==  2) {
      if ($year > 1966)  {$syukujitu[11] = 1;}
      } elsif ($month ==  3) {$syukujitu[&haru_wake_keisan($yy)] = 1;
      } elsif ($month ==  4) {
        if ($year < 1989)  {$syukujitu[29] = 1;}
        if ($year >= 1989) {$syukujitu[29] = 1;}
      } elsif ($month ==  5) {$syukujitu[3]  = 1;
        $syukujitu[5]  = 1;
      if ($year >= 2000) {$syukujitu[4]  = 1;}
      } elsif ($month ==  7) {
        if (($year >= 1996)&&($year < 2003)) {
          $syukujitu[20] = 1;
        }
      } elsif ($month ==  8) {
        if ($year >= 2016)) {
          $syukujitu[11] = 1;
        }
      } elsif ($month ==  9) {$syukujitu[&aki_wake_keisan($yy)] = 1;
        if (($year >= 1996)&&($year <= 2000)) {
          $syukujitu[15] = 1;
        }
      } elsif ($month == 10) {
        if (($year >= 1996)&&($year <= 1996)) {
          $syukujitu[10] = 1;
        }
      } elsif ($month == 11) {
          $syukujitu[3] = 1;
          $syukujitu[23] = 1;
      } elsif ($month == 12) {
        if ($year >= 1989) {$syukujitu[23] = 1;}
      }
  }
}
sub syukujitu_settei_no2 {
# サブルーチンで使用する変数を指定する。
  my($year,$month,$day,$syu,$youbi);
# 呼び出された時の、引数を受け取る
  $year  = @_[0];
  $month = @_[1];
  $day   = @_[2];
  $syu   = @_[3];
  $youbi = @_[4];
  if ($youbi == 1) {
# 第2月曜
    if ($syu == 1) {
      if ($month ==  1) {
        if ($year >= 2000)  {$syukujitu[$day]  = 1;}
      }
      if ($month == 10) {
        if ($year >= 2000)  {$syukujitu[$day]  = 1;}
      }
# 第3月曜
    } elsif ($syu == 2) {
      if ($month == 7) {
        if ($year >= 2003)  {$syukujitu[$day]  = 1;}
      }
      if ($month == 9) {
        if ($year >= 2003)  {$syukujitu[$day]  = 1;}
      }
    }
  } elsif ($youbi == 0) {
    if ($syukujitu[$day] == 1) {	$syukujitu[$day+1]  = 1;}
  }
}
##################
# 春分の日の計算 #
##################
sub haru_wake_keisan {
# サブルーチンで使用する変数を指定する。
  my($year,$syunbun);
# 呼び出された時の、引数を受け取る
  $year = @_[0];
  $syunbun = 0;
# 春分の日(3月xx日)
#       1851-1899       [19.8277 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1900-1979       [20.8357 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1980-2099       [20.8431 + 0.242194*(年-1980)-[(年-1980)/4]]
#       2100-2150       [21.8510 + 0.242194*(年-1980)-[(年-1980)/4]]

#       ※[n]はガウス記号で,nの小数部を捨てた整数部.
  if ($year <= 1899) {
    $syunbun = int(19.8277 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1900) && ($year <= 1979)) {
    $syunbun = int(20.8357 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1980) && ($year <= 2099)) {
    $syunbun = int(20.8431 + 0.242194*($year-1980)-int(($year-1980)/4));
  } elsif (($year >= 2100) && ($year <= 2150)) {
    $syunbun = int(21.8510 + 0.242194*($year-1980)-int(($year-1980)/4));
  }
  return($syunbun);
}
##################
# 秋分の日の計算 #
##################
sub aki_wake_keisan {
# サブルーチンで使用する変数を指定する。
  my($year,$syuubun);
# 呼び出された時の、引数を受け取る
  $year = @_[0];
  $syuubun = 0;
# 秋分の日(9月xx日)
#       1851-1899       [22.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1900-1979       [23.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1980-2099       [23.2488 + 0.242194*(年-1980)-[(年-1980)/4]]
#       2100-2150       [24.2488 + 0.242194*(年-1980)-[(年-1980)/4]]

#       ※[n]はガウス記号で,nの小数部を捨てた整数部.
  if ($year <= 1899) {
    $syuubun = int(22.2588 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1900) && ($year <= 1979)) {
    $syuubun = int(22.2588 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1980) && ($year <= 2099)) {
    $syuubun = int(23.2488 + 0.242194*($year-1980)-int(($year-1980)/4));
  } elsif (($year >= 2100) && ($year <= 2150)) {
    $syuubun = int(24.2488 + 0.242194*($year-1980)-int(($year-1980)/4));
  }
  return($syuubun);
}

syukujitu_settei サブルーチンでは、固定の日の祝日を、@syukujitiの配列変数に、該当する日にちを引数にして 1を代入するようにしてます。 syukujitu_settei_no2 サブルーチンは、第2月曜とか第3月曜の分の祝日を設定するようにしました。 一度にやろうとするとややこしくなるので、分割して考えるとすっきりします。 春分の日、秋分の日は該当日を計算するだけです。
祝日の設定を2つの方法に分けましたので、当然そのおのおののサブルーチンを呼び出す 場所もその方法にあった場所で呼び出すようにしなければなりません。 呼び出すほうのルーチンを見てみましょう。
##################
# メインルーチン #
##################
@knj=('0','1','2','3','4','5','6','7','8','9');
@week=('日','月','火','水','木','金','土');
@chr_col =('red','black','black','black','black','black','blue');
@mchr_col =('black','black','black','black','black','black','white');
@bk_col =('#DD0000','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#0000DD');
@nengappi = localtime;
$yy = $nengappi[5] + 1900;
$mm = $nengappi[4] + 1;
$dd = 1;
# 月末の日付
@matu = (0,31,28,31,30,31,30,31,31,30,31,30,31);
# うるう年の判定 うるう年だったら $matu[2]=29;に変更する
if ($mm == 2) {
  $uruu_check = &uruu_hantei($yy);
  if ($uruu_check == 1) {$matu[2]=29;}
}
# 月末日の設定
# 引数 年,月 春分の日と秋分の日を含む判定
$getumatu = $matu[$mm];
# 祝日の設定
&syukujitu_settei($yy,$mm);
# カレンダーの表示
&display;
exit;

年月日は、実行した時点の日付を取得できるように、 localtime関数 を使っています。
syukujitu_settei サブルーチンは、年と月がわかれば、 1回だけ呼び出せばよいので&displayの上におきました。
##################
# カレンダー表示 #
##################
sub display {
  print "content-type: text/html¥n¥n";
  print "<html>¥n";
  print "<head>¥n";
  <img src="http://bobodori.s17.xrea.com/makimono/images/study/pgm/pa/nami.gif" style="margin:0;">
<b class="red"># 何回目の月曜日?
  $monday_cnt = 0;</b>
# 週(見出し+6週)
  for($y=0;$y<=6;$y++){
   if ($dd <= $getumatu) {
    if ($y==0) {
# 1行目は曜日の見出し
      print "<tr bgcolor=¥"#DDDD00¥">¥n";
    } else {
      print "<tr>¥n";
    }
# 日(<td>)
    for($x=0;$x<=6;$x++){
      if ($y==0) {
# 1行目は曜日の見出しで曜日を入れる
        $knjz = $week[$x];
        print "<td align=¥"center¥" bgcolor=¥"$bk_col[$x]¥">”;
     print "<b style=¥"color:$mchr_col[$x];¥">";
        print "$knjz</b></td>¥n";
      } else {
        if ($x<$start_youbi) {
          $knjz = '';
        } else {
         if ($dd > $getumatu) {
          $knjz = '';
         } else {
          $knjz = &kanji_henkan($dd);
<b class="red"># 祝日判定
          if ($x==1) {$monday_cnt++;}# 何回目の月曜日?
# 引数 年,月,日,第n月曜,曜日
          &syukujitu_settei_no2($yy,$mm,$dd,$monday_cnt,$x);
# 祝日の時は、文字色は赤
          if ($syukujitu[$dd] == 1) {
            $chrcol = 'red';
          } else {
            $chrcol = $chr_col[$x];
          }</b>
# 日付を増やす
          $dd++;
          $start_youbi = 0;
         }
        }
        print "<td align=¥"center¥">";
        print "<b style=¥"color:<b class="red">$chrcol</b>;¥">";
        print "$knjz</b></td>¥n";
      }
    }
    print "</tr>¥n";
   }
  }
			<img src="http://bobodori.s17.xrea.com/makimono/images/study/pgm/pa/nami.gif" style="margin:0;">
syukujitu_settei_no2 サブルーチンは、月曜日の第何週にあたるかが わからないと祝日の設定が出来ませんので、displayサブルーチンの中の 日にちを出力している部分におきました。
# 何回目の月曜日?
  $monday_cnt = 0;
第何週目なのかを判定するための変数$monday_cntに初期値をセットします。
 if ($x==1) {$monday_cnt++;}# 何回目の月曜日?
第何週目なのかを判定するために月曜日をカウントしてます。


完成したものは以下の通りです。
#!/usr/bin/perl
##################
# メインルーチン #
##################
@knj=('0','1','2','3','4','5','6','7','8','9');
@week=('日','月','火','水','木','金','土');
@chr_col =('red','black','black','black','black','black','blue');
@mchr_col =('black','black','black','black','black','black','white');
@bk_col =('#DD0000','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#0000DD');
@nengappi = localtime;
$yy = $nengappi[5] + 1900;
$mm = $nengappi[4] + 1;
$dd = 1;
# 月末の日付
@matu = (0,31,28,31,30,31,30,31,31,30,31,30,31);
# うるう年の判定 うるう年だったら $matu[2]=29;に変更する
if ($mm == 2) {
  $uruu_check = &uruu_hantei($yy);
  if ($uruu_check == 1) {$matu[2]=29;}
}
# 月末日の設定
$getumatu = $matu[$mm];
# 祝日の設定
# 引数 年,月 春分の日と秋分の日を含む判定
&syukujitu_settei($yy,$mm);
&display;
exit;


# HTML出力
sub display {
  print "Content-type: text/html¥n¥n";
  print "<!DOCTYPE html>¥n";
  print "<HTML>¥n";
  print "<HEAD>¥n";
  print "<meta http-equiv=¥"Content-Type¥" content=¥"text/html; charset=UTF-8¥">¥n";
  print "<TITLE>カレンダー</TITLE>¥n";
  print "</HEAD>¥n";
  print "<BODY>¥n";
#ツェラーの公式を呼び出す
  $start_youbi = &getweek($yy,$mm,$dd);
  print "<table border=¥"1¥" bgcolor=¥"#FFFFFF¥">¥n";
  print "<tr bgcolor=¥"#DDDD00¥">¥n";
  $year = &kanji_henkan($yy);
  $month = &kanji_henkan($mm);
  print "<td colspan=¥"7¥" align=¥"center¥">";
  print "<b>$year年$month月</b></td>¥n";
  print "</tr>¥n";
# 何回目の月曜日?
  $monday_cnt = 0;
# 週(見出し+6週)
  for($y=0;$y<=6;$y++){
   if ($dd <= $getumatu) {
    if ($y==0) {
# 1行目は曜日の見出し
      print "<tr bgcolor=¥"#DDDD00¥">¥n";
    } else {
      print "<tr>¥n";
    }
# 日(<td>)
    for($x=0;$x<=6;$x++){
      if ($y==0) {
# 1行目は曜日の見出しで曜日を入れる
        $knjz = $week[$x];
        print "<td align=¥"center¥" bgcolor=¥"$bk_col[$x]¥">";
        print "<b style=¥"color:$mchr_col[$x];¥">$knjz";
        print "</b></td>¥n";
      } else {
        if ($x<$start_youbi) {
          $knjz = '';
        } else {
         if ($dd > $getumatu) {
          $knjz = '';
         } else {
          $knjz = &kanji_henkan($dd);
# 祝日判定
          if ($x==1) {$monday_cnt++;}# 何回目の月曜日?
          &syukujitu_settei_no2($yy,$mm,$dd,$monday_cnt,$x);  # 引数 年,月,日,第n月曜,曜日
# 祝日の時は、文字色は赤
          if ($syukujitu[$dd] == 1) {
            $chrcol = 'red';
          } else {
            $chrcol = $chr_col[$x];
          }
# 日付を増やす
          $dd++;
          $start_youbi = 0;
         }
        }
        print "<td align=¥"center¥"><b style=¥"color:$chrcol;¥">";
        print "$knjz</b></td>¥n";
      }
    }
    print "</tr>¥n";
   }
  }
  print "</table>¥n";
  print "</BODY>¥n";
  print "</HTML>¥n";
}


# 半角数字を全角数字にする
sub kanji_henkan {
  my($suuji,$no1000,$no100,$no10,$no1,$knjz);
  $suuji = @_[0];
# 変換は4桁まで
  if ($suuji>9999) {
    $kanjz = "変換不能";
    return ($kanjz);
  }
  if ($suuji>999) {
    $no1000=int($suuji / 1000);
    $no100 =int(($suuji - $no1000 * 1000)/100);
    $no10  =int(($suuji - $no1000 * 1000 - $no100 * 100)/10);
    $no1   =$suuji % 10;
    $knjz  =$knj[$no1000].$knj[$no100].$knj[$no10].$knj[$no1];
  } elsif ($suuji>99) {
    $no100 =int($suuji / 100);
    $no10  =int(($suuji - $no100 * 100)/10);
    $no1   =$suuji % 10;
    $knjz  =$knj[$no100].$knj[$no10].$knj[$no1];
  } elsif ($suuji>9) {
    $no10  =int($suuji/10);
    $no1   =$suuji % 10;
    $knjz  =$knj[$no10].$knj[$no1];
  } else {
    $knjz  =$knj[$suuji];
  }
  return($knjz);
}
##################
# ツェラーの公式 #
##################
sub getweek {
# サブルーチンで使用する変数を指定する。
  local($yy, $mm, $dd,$wk);
# 呼び出された時の、引数を受け取る
  ($yy, $mm, $dd) = @_;
# 月が、1月、2月の時は、前年の13月、14月で計算する
  if ($mm == 1 or $mm == 2) {
    $yy--;
    $mm += 12;
  }
# 公式で計算する
  $wk = int($yy
  + int($yy / 4) - int($yy / 100) + int($yy / 400)
  + int(2.6 * $mm + 1.6) + $dd) % 7;
# 計算した結果を返す
  return($wk);
}
##################
# うるう年の判定 #
##################
sub uruu_hantei {
# サブルーチンで使用する変数を指定する。
my($year,$uruu);
# 呼び出された時の、引数を受け取る
$year = @_[0];
$uruu = 0;
# 西暦年が4で割り切れる年は閏年とする。
# 西暦年が4で割り切れる年のうち、100で割り切れる年は閏年としない。
# 西暦年が4で割り切れ、100でも割り切れる年のうち、400で割り切れる年は閏年とする。
 if (($year % 4) == 0) {
   $uruu = 1;
   if (($yy % 100) == 0) {
     $uruu = 0;
     if (($yy % 400) == 0) {
       $uruu = 1;
     }
   }
 }
 return($uruu);
}
##############
# 祝日の設定 #
##############
sub syukujitu_settei {
# サブルーチンで使用する変数を指定する。
  my($year,$month);
# 呼び出された時の、引数を受け取る
  $year  = @_[0];
  $month = @_[1];
  if ($year >1948) {
# 1月
    if		($month ==  1) {$syukujitu[1]  = 1;
      if ($year < 2000)  {$syukujitu[15] = 1;}
# 2月
    } elsif ($month ==  2) {
      if ($year > 1966)  {$syukujitu[11] = 1;}
# 3月
    } elsif ($month ==  3) {$syukujitu[&haru_wake_keisan($yy)] = 1;
# 4月
    } elsif ($month ==  4) {
      if ($year < 1989)  {$syukujitu[29] = 1;}
      if ($year >= 1989) {$syukujitu[29] = 1;}
# 5月
    } elsif ($month ==  5) {$syukujitu[3]  = 1;
        $syukujitu[5]  = 1;
        if ($year >= 2000) {$syukujitu[4]  = 1;}
# 7月
    } elsif ($month ==  7) {
      if (($year >= 1996)&&($year < 2003)) {
        $syukujitu[20] = 1;
      }
# 8月
    } elsif ($month ==  8) {
      if ($year >= 2016) {
        $syukujitu[11] = 1;
      }
# 9月
    } elsif ($month ==  9) {$syukujitu[&aki_wake_keisan($yy)] = 1;
      if (($year >= 1996)&&($year <= 2000)) {
        $syukujitu[15] = 1;
      }
# 10月
    } elsif ($month == 10) {
      if (($year >= 1996)&&($year <= 1996)) {
        $syukujitu[10] = 1;
      }
# 11月
    } elsif ($month == 11) {
        $syukujitu[3] = 1;
        $syukujitu[23] = 1;
# 12月
    } elsif ($month == 12) {
      if ($year >= 1989) {$syukujitu[23] = 1;}
    }
  }
}
sub syukujitu_settei_no2 { # 引数 年,月,日,第n月曜,曜日
# サブルーチンで使用する変数を指定する。
  my($year,$month,$day,$syu,$youbi);
# 呼び出された時の、引数を受け取る
  ($year,$month,$day,$syu,$youbi)  = @_;
# 月曜日
  if ($youbi == 1) {
# 第2月曜
    if ($syu == 2) {
# 1月
      if ($month ==  1) {
        if ($year >= 2000)  {$syukujitu[$day]  = 1;}
      }
# 10月
      if		($month == 10) {
        if ($year >= 2000)  {$syukujitu[$day]  = 1;}
      }
# 第3月曜
    } elsif ($syu == 3) {
# 7月
      if ($month == 7) {
        if ($year >= 2003)  {$syukujitu[$day]  = 1;}
      }
# 9月
      if ($month == 9) {
        if ($year >= 2003)  {$syukujitu[$day]  = 1;}
      }
    }
# 振替休日
  } elsif ($youbi == 0) {
    if ($syukujitu[$day] == 1) {	$syukujitu[$day+1]  = 1;}
  }
}
##################
# 春分の日の計算 #
##################
sub haru_wake_keisan {
# サブルーチンで使用する変数を指定する。
  my($year,$syunbun);
# 呼び出された時の、引数を受け取る
  $year = @_[0];
  $syunbun = 0;
# 春分の日(3月xx日)
#       1851-1899       [19.8277 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1900-1979       [20.8357 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1980-2099       [20.8431 + 0.242194*(年-1980)-[(年-1980)/4]]
#       2100-2150       [21.8510 + 0.242194*(年-1980)-[(年-1980)/4]]

#       ※[n]はガウス記号で,nの小数部を捨てた整数部.
  if ($year <= 1899) {
    $syunbun = int(19.8277 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1900) && ($year <= 1979)) {
    $syunbun = int(20.8357 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1980) && ($year <= 2099)) {
    $syunbun = int(20.8431 + 0.242194*($year-1980)-int(($year-1980)/4));
  } elsif (($year >= 2100) && ($year <= 2150)) {
    $syunbun = int(21.8510 + 0.242194*($year-1980)-int(($year-1980)/4));
  }
  return($syunbun);
}
##################
# 秋分の日の計算 #
##################
sub aki_wake_keisan {
# サブルーチンで使用する変数を指定する。
  my($year,$syuubun);
# 呼び出された時の、引数を受け取る
  $year = @_[0];
  $syuubun = 0;
# 秋分の日(9月xx日)
#       1851-1899       [22.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1900-1979       [23.2588 + 0.242194*(年-1980)-[(年-1983)/4]]
#       1980-2099       [23.2488 + 0.242194*(年-1980)-[(年-1980)/4]]
#       2100-2150       [24.2488 + 0.242194*(年-1980)-[(年-1980)/4]]

#       ※[n]はガウス記号で,nの小数部を捨てた整数部.
  if ($year <= 1899) {
    $syuubun = int(22.2588 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1900) && ($year <= 1979)) {
    $syuubun = int(22.2588 + 0.242194*($year-1980)-int(($year-1983)/4));
  } elsif (($year >= 1980) && ($year <= 2099)) {
    $syuubun = int(23.2488 + 0.242194*($year-1980)-int(($year-1980)/4));
  } elsif (($year >= 2100) && ($year <= 2150)) {
    $syuubun = int(24.2488 + 0.242194*($year-1980)-int(($year-1980)/4));
  }
  return($syuubun);
}
出来上がったら、c:¥xampp¥htdocs¥cgi-bin¥terakoya フォルダ にpa09.cgiの名前で保存しましょう。 文字コードは、UTF-8で保存を忘れずに。

実行は、ブラウザのURL欄に localhost/cgi-bin/terakoya/pa09.cgi と打ち込んで実行します。 実行すると・・・。
実行結果




ページトップへ戻る