EC-CUBE の定休日管理には祝日があらかじめ入っていますが、ハッピーマンデー制度で曜日固定となった成人の日・海の日・敬老の日・体育の日と、閣議で日付が決定される春分の日・秋分の日は、毎年日付が変わるため手動で更新する必要があります。できるだけ自動で更新できたほうが便利ですから、ここでは PHP スクリプトを使って、祝日の日付を自動更新する方法について説明します。
毎年更新が必要になる祝日
本稿執筆時点で、毎年日付が変わる祝日は以下の通りです。
祝日名 | 日付 | 備考 |
---|---|---|
成人の日 | 1月第2月曜日 | |
海の日 | 7月第3月曜日 | |
敬老の日 | 9月第3月曜日 | |
体育の日 | 10月第2月曜日 | 春分の日 | 春分日 (3月19日〜3月22日) |
国立天文台「暦象年表」に基づき閣議決定、 前年2月1日頃に官報で暦要項として公告。 |
秋分の日 | 秋分日 (9月22日〜9月24日) |
国立天文台「暦象年表」に基づき閣議決定、 前年2月1日頃に官報で暦要項として公告。 |
(出典:国民の祝日 – Wikipedia)
PHP スクリプトで日付を更新する SQL を出力する
以下のプログラムを update_holiday.php として用意します。
第何何曜日の日付は、 PHP の strtotime 関数で簡単に求めることができます。春分の日と秋分の日は日付を予測するための計算式を用いていますが、必ずしも計算結果通りの日付とならない場合もあるため、念のため毎年確認するのがよいでしょう。
また、 holiday_id は本稿執筆時点の最新版の EC-CUBE 2.13.1 をインストールした際に自動でインポートされたものを参考にしているため、実際の環境と異なる場合は適宜変更してください。
<?php // holiday_id=2 成人の日(1月第2月曜日) echo "update dtb_holiday set day = " . date("d", strtotime("Second Monday of January")) . " where holiday_id = 2;\n"; // holiday_id=9 海の日(7月第3月曜日) echo "update dtb_holiday set day = " . date("d", strtotime("Third Monday of July")) . " where holiday_id = 9;\n"; // holiday_id=10 敬老の日(9月第3月曜日) echo "update dtb_holiday set day = " . date("d", strtotime("Third Monday of September")) . " where holiday_id = 10;\n"; // holiday_id=12 体育の日(10月第2月曜日) echo "update dtb_holiday set day = " . date("d", strtotime("Second Monday of October")) . " where holiday_id = 12;\n"; // holiday_id=4 春分の日 echo "update dtb_holiday set day = " . (floor(20.8431 + 0.242194 * (date('Y') - 1980)) - floor((date('Y') - 1980) / 4)) . " where holiday_id = 4;\n"; // holiday_id=11 秋分の日 echo "update dtb_holiday set day = " . (floor(23.2488 + 0.242194 * (date('Y') - 1980)) - floor((date('Y') - 1980) / 4)) . " where holiday_id = 11;\n"; ?>
毎年自動更新する
update_holiday.php を crontab に登録して、毎年1月1日の0:00に実行するように設定します。
[user@localhost ~]$ crontab -l
0 0 1 1 * /usr/bin/php -f /path/to/update_holiday.php | mysql -uuser -ppassword eccube > /dev/null 2>&1
0 0 1 1 * /usr/bin/php -f /path/to/update_holiday.php | mysql -uuser -ppassword eccube > /dev/null 2>&1