はじめに PHP で azuyalabs/yasumi を使って祝日を判定する方法を整理した。
TL;DR
composer require azuyalabs/yasumi
でインストール
Yasumi::create
でインスタンス生成
isHoliday
で祝日判定
addHoliday
で独自の祝日追加
目次 はじめに TL;DR 環境・条件 詳細 セットアップ 使い方 インスタンス生成 祝日の確認(表示) 祝日判定 祝日追加 まとめ その他・メモ 参考文献
環境・条件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ grep -i pretty /etc/os-release PRETTY_NAME="Ubuntu 16.04.3 LTS" $ php -v PHP 7.2.22-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Sep 2 2019 12:54:12) ( NTS ) $ composer -V Composer version 1.9.0 2019-08-02 20:55:32 $ composer info laravel/framework name : laravel/framework versions : * v5.7.28 $ composer show azuyalabs/yasumi name : azuyalabs/yasumi versions : * 2.2.0
詳細 セットアップ composer require azuyalabs/yasumi
でインストール
1 2 3 4 5 6 $ composer require azuyalabs/yasumi Using version ^2.2 for azuyalabs/yasumi ... - Installing azuyalabs/yasumi (2.2.0): Downloading (100%) ... Package manifest generated successfully.
使い方 以降 Tinker(PsySh) 上での動作確認結果。
インスタンス生成 Yasumi::create($country, $year[, $locale])
でインスタンス生成。
1 >>> $holidays = \Yasumi\Yasumi::create('Japan' , 2020 )
祝日の確認(表示) foreach
でループ、出力すると祝日を確認可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> foreach ($holidays as $holiday) { echo $holiday . "\n" ; } 2020 -01 -01 2020 -01 -13 2020 -02 -11 2020 -02 -23 2020 -02 -24 2020 -03 -20 2020 -04 -29 2020 -05 -03 2020 -05 -04 2020 -05 -05 2020 -05 -06 2020 -07 -23 2020 -07 -24 2020 -08 -10 2020 -09 -21 2020 -09 -22 2020 -11 -03 2020 -11 -23
getName
で祝日名の取得、locale 未指定の場合は英語表記。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> foreach ($holidays as $holiday) { echo $holiday . ' : ' . $holiday->getName() . "\n" ; } 2020 -01 -01 : New Year's Day 2020-01-13 : Coming of Age Day 2020-02-11 : National Foundation Day 2020-02-23 : Emperors Birthday 2020-02-24 : Emperors Birthday observed 2020-03-20 : Vernal Equinox Day 2020-04-29 : Showa Day 2020-05-03 : Constitution Memorial Day 2020-05-04 : Greenery Day 2020-05-05 : Children' s Day2020 -05 -06 : Constitution Memorial Day observed2020 -07 -23 : Marine Day2020 -07 -24 : Sports Day2020 -08 -10 : Mountain Day2020 -09 -21 : Respect for the Aged Day2020 -09 -22 : Autumnal Equinox Day2020 -11 -03 : Culture Day2020 -11 -23 : Labor Thanksgiving Day
インスタンス生成時に locale 指定すると日本語で取得可能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >>> $holidays = \Yasumi\Yasumi::create('Japan' , 2020 , 'ja_JP' ) >>> foreach ($holidays as $holiday) { echo $holiday . ' : ' . $holiday->getName() . "\n" ; } 2020 -01 -01 : 元日2020 -01 -13 : 成人の日2020 -02 -11 : 建国記念の日2020 -02 -23 : 天皇誕生日2020 -02 -24 : 天皇誕生日 observed2020 -03 -20 : 春分の日2020 -04 -29 : 昭和の日2020 -05 -03 : 憲法記念日2020 -05 -04 : みどりの日2020 -05 -05 : こどもの日2020 -05 -06 : 憲法記念日 observed2020 -07 -23 : 海の日2020 -07 -24 : スポーツの日 2020 -08 -10 : 山の日2020 -09 -21 : 敬老の日2020 -09 -22 : 秋分の日2020 -11 -03 : 文化の日2020 -11 -23 : 勤労感謝の日
祝日判定 isHoliday
で祝日かどうかの判定が可能。DateTime
もしくは Carbon
インスタンスを利用可、String
はエラーになった。
1 2 3 4 5 6 7 8 9 >>> $holidays->isHoliday(new DateTime('2020-01-01' )) => true >>> $holidays->isHoliday(Carbon\Carbon::today()) => true >>> $holidays->isHoliday('2020-01-01' ) TypeError: Argument 1 passed to Yasumi/Provider/AbstractProvider::isHoliday() must implement interface DateTimeInterface , string given on line 1
String
も使いたい、ってことで適当に作った祝日判定関数。 (本当はもうちょい型の検査とかをちゃんとすべきだと思う)
1 2 3 4 5 6 7 function is_holiday ($date = null) { $date = $date ?? Carbon::today(); $date = is_string($date) ? Carbon::parse($date) : $date; $holidays = Yasumi::create('Japan' , $date->year, 'ja_JP' ); return $holidays->isHoliday($date); }
祝日追加 foreach
での出力結果を確認してもらえばわかる通り、年末年始(三ヶ日など)は祝日として適用されない。
実際に祝日ではないので正しい動作だが、実態としては「12/29〜01/03 あたりはすべて祝日扱いにしたい」というケースもあるはず。
new Holiday
で祝日インスタンスを生成し、addHoliday
で独自の祝日を追加可能
1 2 3 4 5 6 7 8 9 10 11 >>> $my_holiday = new \Yasumi\Holiday('hoge day' , ['ja_JP' => 'ほげ日' ], new DateTime('2020-03-25' ), 'ja_JP' ) => Yasumi\Holiday @1585062000 { date: 2020 -03 -25 00 :00 :00.0 Asia/Tokyo (+09 :00 ), } >>> new \Yasumi\Holiday('hoge day' , ['ja_JP' => 'ほげ日' ], new Carbon\Carbon(), 'ja_JP' ) => Yasumi\Holiday @1585062000 { date: 2020 -03 -25 00 :00 :00.0 Asia/Tokyo (+09 :00 ), }
addHoliday
で追加されているのがわかる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 >>> $holidays->addHoliday($my_holiday) >>> foreach ($holidays as $holiday) { echo $holiday . "\n" ; } 2020 -01 -01 2020 -01 -13 2020 -02 -11 2020 -02 -23 2020 -02 -24 2020 -03 -20 2020 -03 -25 2020 -04 -29 2020 -05 -03 2020 -05 -04 2020 -05 -05 2020 -05 -06 2020 -07 -23 2020 -07 -24 2020 -08 -10 2020 -09 -21 2020 -09 -22 2020 -11 -03 2020 -11 -23
ちなみに同じ日を addHoliday
で再追加しても特に変化はない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 >>> $holidays->addHoliday($my_holiday) >>> foreach ($holidays as $holiday) { echo $holiday . "\n" ; } 2020 -01 -01 2020 -01 -13 2020 -02 -11 2020 -02 -23 2020 -02 -24 2020 -03 -20 2020 -03 -25 2020 -04 -29 2020 -05 -03 2020 -05 -04 2020 -05 -05 2020 -05 -06 2020 -07 -23 2020 -07 -24 2020 -08 -10 2020 -09 -21 2020 -09 -22 2020 -11 -03 2020 -11 -23
まとめ
composer require azuyalabs/yasumi
でインストール
Yasumi::create
でインスタンス生成
isHoliday
で祝日判定
addHoliday
で独自の祝日追加
その他・メモ
公式ドキュメント がわかりにくかった(API Reference 的なのが無いので)。。。
Laravel で使う場合は composer require
でのインストールだけで OK
参考文献
関連記事