PHPで祝日を求める

(4/4)

サンプル・プログラムの解説:振替休日

0252:  * 振替休日かどうか調べる
0253:  * @param int $year  西暦年
0254:  * @param int $month 月
0255:  * @param int $day   日
0256:  * @return bool TRUE/FALSE
0257: */
0258: function isTransferHoliday($year$month$day) {
0259:     $jd = Gregorian2JD($year$month$day);
0260:     $j0 = Gregorian2JD(1973, 4, 12);
0261:     if ($jd < $j0)  return FALSE;        //有効なのは1973年4月12日以降
0262: 
0263:     //当日が祝日なら FALSE
0264:     if (isFixedMovableHoliday($year$month$day))     return FALSE;
0265: 
0266:     $n = ($year <= 2006) ? 1 : 7; //改正法なら最大7日間遡る
0267:     $jd--;                         //1日前
0268:     for ($i = 0$i < $n$i++) {        //無限ループに陥らないように
0269:         list($yy$mm$dd) = JD2Gregorian($jd);
0270:         //祝日かつ日曜日なら振替休日
0271:         if (isFixedMovableHoliday($yy$mm$dd)
0272:             && (getWeekNumber($yy$mm$dd) == 0))     return TRUE;
0273:         //祝日でなければ打ち切り
0274:         if (! isFixedMovableHoliday($yy$mm$dd))      break;
0275:         $jd--; //1日前
0276:     }
0277:     return FALSE;
0278: }

日曜日と祝日が重なった場合、月曜日が祝日になる。これが振替休日である。1973 年 4 月 12 日からはじまった。
ところがハッピーマンデー法が制定されてから以降は、日曜日、月曜日が連続して祝日になるケースが発生する。そこで、2007 年 1 月以降は、
祝日が日曜にあたるときは、その日後において、その日に最も近い「国民の祝日」でない日を休日
とすることになった。前述の場合は火曜日が祝日になる。
とくに 2009 年は、5 月 3 日の日曜日が憲法記念日、月曜日のみどりの日、火曜日のこどもの日と、祝日が 3 日連続することになった。この場合は水曜日が振替休日となる。
space
ユーザー関数 isTransferHoliday は、与えられた西暦年月日が振替休日かどうか調べるものである。
前日が祝日である場合は、for ループを用い、日曜日まで祝日が続いているかどうか遡ってチェックするようにしている。連続していれば、その日は振替休日である。
ここで while ではなく for ループを用いたのは、引数や他の祝日判定の異常で無限ループに陥ることがないようにするための配慮である。
space

サンプル・プログラムの解説:国民の休日

0280: /**
0281:  * 国民の休日かどうか調べる
0282:  * @param int $year  西暦年
0283:  * @param int $month 月
0284:  * @param int $day   日
0285:  * @return bool TRUE/FALSE
0286: */
0287: function isNationalHoliday($year$month$day) {
0288:     if ($year < 2003)   return FALSE;    //有効なのは2003年以降
0289:     $j0 = Gregorian2JD($year$month$day) - 1;  //前日
0290:     list($yy0$mm0$dd0) = JD2Gregorian($j0);
0291:     $j1 = Gregorian2JD($year$month$day) + 1;  //翌日
0292:     list($yy1$mm1$dd1) = JD2Gregorian($j1);
0293: 
0294:     //前日と翌日が固定祝日または移動祝日なら国民の休日
0295:     if (isFixedMovableHoliday($yy0$mm0$dd0)
0296:         && isFixedMovableHoliday($yy1$mm1$dd1))     return TRUE;
0297:     return FALSE;
0298: }

固定祝日、移動祝日1、移動祝日2のいずれかで挟まれた 1 日は「国民の休日」となる。2003 年以降に有効になる。
space
ユーザー関数 isNationalHoliday は、与えられた西暦年月日が国民の休日かどうかを調べる。
その翌日と前日が、固定祝日、移動祝日1、移動祝日2のいずれかでないかどうかを調べているだけである。
space

サンプル・プログラムの解説:祝日を求める

0300: /**
0301:  * 祝日であれば、その名称を取得する
0302:  * @param int $year  西暦年
0303:  * @param int $month 月
0304:  * @param int $day   日
0305:  * @param string lang jp=日本語名称/en=英語名称
0306:  * @return string 祝日の名称/FALSE=祝日ではない
0307: */
0308: function getHoliday($year$month$day$lang) {
0309:     //固定祝日
0310:     $name = getFixedHoliday($year$month$day, 'jp');
0311:     if ($name != FALSE)      return $name;
0312:     //移動祝日(春分/秋分の日)
0313:     $name = getMovableHoliday1($year$month$day, 'jp');
0314:     if ($name != FALSE)      return $name;
0315:     //移動祝日(ハッピーマンデー)
0316:     $name = getMovableHoliday2($year$month$day, 'jp');
0317:     if ($name != FALSE)      return $name;
0318:     //振替休日
0319:     if (isTransferHoliday($year$month$day)) {
0320:         return preg_match("/JP/i", $lang) == 1 ? '振替休日' : 'holiday in lieu';
0321:     }
0322:     //国民の祝日
0323:     if (isNationalHoliday($year$month$day)) {
0324:         return preg_match("/JP/i", $lang) == 1 ? '国民の休日' : "Citizen's Holiday";
0325:     }
0326:     //祝日ではない
0327:     return FALSE;
0328: }
0329: 
0330: /**
0331:  * 祝日かどうかを調べる
0332:  * @param int $year  西暦年
0333:  * @param int $month 月
0334:  * @param int $day   日
0335:  * @return bool TRUE/FALSE
0336: */
0337: function isHoliday($year$month$day) {
0338:     return getHoliday($year$month$day, 'jp') == FALSE ? FALSE : TRUE;
0339: }

ユーザー関数 getHoliday は、与えられた西暦年月日が祝日であれば、その名称を返す。
固定祝日、移動祝日1、移動祝日2、振替休日、国民の休日を順々に調べている。
space
ユーザー関数 isHoliday は、与えられた西暦年月日が祝日かどうかを調べるものである。
space
以上の関数を利用し、入力された西暦年から以降3 年分の祝日一覧を表示するのがサンプル・プログラムである。

祝日と祭日

Wikipedia によれば、「祭日」とは「宗教儀礼上重要な祭祀を行う日のこと」とされている。
戦後、GHQ の占領下において、神道に基づく儀礼は一切廃止されたため、「祭日」は無くなった。そして、国民が祝うべき「祝日」に切り替わったのである。
ところが実際は、新憲法が制定された 1947 年(昭和 22 年)を過ぎても戦前の祝日法が有効であり、ようやく 1948 年(昭和 23 年)になって新しい「国民の祝日に関する法律」(祝日法)が定められた。
space
『国民の祝日』の由来がわかる小事典」(所功/PHP研究所/2003 年 08 月)は、祝日を
  1. 祭日に基づく祝日
  2. 国家にちなむ祝日
  3. 人生に伴う祝日
の 3 つに分類しているが、「春分の日」「秋分の日」「勤労感謝の日」は「祭日に基づく祝日」に分類している。これらは、農耕民族である日本人古来の祭礼に基づく祝日だからである。表向き、祭日が無くなったとはいえ、実はしっかりとカレンダーに根付いているのである。

参考書籍

参考サイト

(この項おわり)
header