休日、祝日を判断する関数作りました。

php
目次

休日、祝日を判断する関数

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;  //  平日を返す
    }
?>
  • URLをコピーしました!
目次