目次
休日、祝日を判断する関数
date関数を使って土日の判断はできても、祝日の判断はデータがないと調べようがないですよね。
というわけで今回は、内閣府のホームページから国民の祝日CSVデータをダウンロードして「休日、祝日の場合は1を返す」関数を作ってみました。
※祝日のデータはCSVデータに依存するため、CSVのデータは個人でダウンロードしてください。また、データも現時点(2023/9/29)では2024年までのデータしか入っていないので都度、CSVをダウンロードしてください。
URL:https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
ソース
<?php
define("SYUKUJITSU_CSV", "./syukujitsu.csv");
print_r(calcHoliday("2023/10/9", SYUKUJITSU_CSV));
// 出力結果:1
/**
* 引数.日付が休日または祝日の場合、1を返す
* @param 日付
* @param CSVのパス
* @return int
*/
function calcHoliday($day, $path){
$day = date("Y/m/d", strtotime($day)); // Y/m/d形式に変換
$line = 1; // CSVにはヘッダがあるためヘッダスキップを判断させる
// 祝日マスタCSVを読み込む
$handle = fopen($path, "r"); // CSVを開く
// 休日チェック
switch (date("w", strtotime($day))){ // 曜日の数値を判断
case 0: // 0の場合は土曜日のため1を返す
return 1;
case 6: // 6の場合は日曜日のため1を返す
return 1;
default: // その他の場合はCSVデータから祝日かどうかをチェックする
// 祝日チェック
while(($data = fgetcsv($handle, 100000, ",")) !== FALSE) {
if($line == 1){ // CSVの1行目(ヘッダ)をスキップ
$line++;
continue;
}
// 引数.日付とCSV1列目の日付が一致する場合、祝日のため1を返す
if($day == date("Y/m/d", strtotime($data[0]))){
return 1;
}
}
return 0; // 上記以外は平日のため0を返す
}
}
?>指定日が休日、祝日の場合は次の最短の平日の日付を返す関数
応用で引数.日付が休日または祝日だった場合に、次の最短の平日の日付を返す関数も作りました。
<?php
define("SYUKUJITSU_CSV", "./syukujitsu.csv");
print_r(calcHoliday("2023/10/7", SYUKUJITSU_CSV));
// 出力結果:2023/10/10
/**
* 引数.日付が休日、祝日の場合、次の平日を返す
* @param 日付
* @return 平日の日付
*/
function calcHoliday($day, $path){
$day = date("Y/m/d", strtotime($day));
$line = 1;
// 祝日マスタCSVを読み込む
$handle = fopen($path, "r");
// 引数.日付が休日、祝日の場合、次の平日が来るまで日付を+1日する
for($i = 1; $i <= 20; $i++){
// 休日チェック
switch (date("w", strtotime($day))){
case 0:
$day = date("Y/m/d", strtotime($day."+1 day")); // 土曜日の場合、+1日
continue 2; // 次のループにスキップして再チェック
case 6:
$day = date("Y/m/d", strtotime($day."+1 day")); // 日曜日の場合、+1日
continue 2; // 次のループにスキップして再チェック
default:
// 祝日チェック
while(($data = fgetcsv($handle, 100000, ",")) !== FALSE) {
if($line == 1){
$line++;
continue 1;
}
if($day == date("Y/m/d", strtotime($data[0]))){
$day = date("Y/m/d", strtotime($day."+1 day")); // 祝日の場合、+1日
}
}
continue 2; // 次のループにスキップして再チェック
}
}
return $day; // 平日を返す
}
?>