はじめに

PHP で azuyalabs/yasumi を使って祝日を判定する方法を整理した。

TL;DR

  • composer require azuyalabs/yasumi でインストール
  • Yasumi::create でインスタンス生成
  • isHoliday で祝日判定
  • addHoliday で独自の祝日追加
この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. セットアップ
    2. 使い方
      1. インスタンス生成
      2. 祝日の確認(表示)
      3. 祝日判定
      4. 祝日追加
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

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 Day
2020-05-06 : Constitution Memorial Day observed
2020-07-23 : Marine Day
2020-07-24 : Sports Day
2020-08-10 : Mountain Day
2020-09-21 : Respect for the Aged Day
2020-09-22 : Autumnal Equinox Day
2020-11-03 : Culture Day
2020-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 : 天皇誕生日 observed
2020-03-20 : 春分の日
2020-04-29 : 昭和の日
2020-05-03 : 憲法記念日
2020-05-04 : みどりの日
2020-05-05 : こどもの日
2020-05-06 : 憲法記念日 observed
2020-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

// String はエラー
>>> $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
// 祝日名, locale ごとの変換, 日付, locale
>>> $my_holiday = new \Yasumi\Holiday('hoge day', ['ja_JP' => 'ほげ日'], new DateTime('2020-03-25'), 'ja_JP')
=> Yasumi\Holiday @1585062000 {#3504
date: 2020-03-25 00:00:00.0 Asia/Tokyo (+09:00),
}

// Carbon でも OK
>>> new \Yasumi\Holiday('hoge day', ['ja_JP' => 'ほげ日'], new Carbon\Carbon(), 'ja_JP')
=> Yasumi\Holiday @1585062000 {#3503
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

参考文献

関連記事

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list