もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

phpの祝日ライブラリはYasumiが良かった

はじめに

こんばんは。

以前 GoogleCalenderから祝日データを取得する 記事を上げたのですが、Yasumiというライブラリを使用して、祝日データをとるような処理をしたので記録を残しておきます。

github.com

本題

1. 現在が祝日かどうか

<?php
use Yasumi\Yasumi;

function isHoliday(\DateTimeInterface $currentTime, $country = 'Japan', $locale = 'ja_JP'): bool
{
    $holidays = Yasumi::create($country, (int)$currentTime->format('Y'), $locale);
    return $holidays->isHoliday($currentTime);
}

isHoliday(new \DateTime('2020-03-20'));
  => true

2. その年の祝日一覧

<?php
use Yasumi\Yasumi;

function holidays(\DateTimeInterface $currentTime, $country = 'Japan', $locale = 'ja_JP'): array
{
    $holidays = Yasumi::create($country, (int)$currentTime->format('Y'), $locale);
    $results  = [];
    foreach ($holidays->getHolidays() as $holiday) {
        $results[$holiday->format('Y-m-d')] = $holiday->getName();
    }
    return $results;
}

holidays(new \DateTime('2020-03-20'));
  => array(18) {
  '2020-01-01' =>
  string(6) "元日"
  '2020-01-13' =>
  string(12) "成人の日"
  '2020-02-11' =>
  string(18) "建国記念の日"
  '2020-02-23' =>
  string(15) "天皇誕生日"
  '2020-02-24' =>
  string(24) "天皇誕生日 observed"
  '2020-03-20' =>
  string(12) "春分の日"
  '2020-04-29' =>
  string(12) "昭和の日"
  '2020-05-03' =>
  string(15) "憲法記念日"
  '2020-05-04' =>
  string(15) "みどりの日"
  '2020-05-05' =>
  string(15) "こどもの日"
  '2020-05-06' =>
  string(24) "憲法記念日 observed"
  '2020-07-23' =>
  string(9) "海の日"
  '2020-07-24' =>
  string(18) "スポーツの日"
  '2020-08-10' =>
  string(9) "山の日"
  '2020-09-21' =>
  string(12) "敬老の日"
  '2020-09-22' =>
  string(12) "秋分の日"
  '2020-11-03' =>
  string(12) "文化の日"
  '2020-11-23' =>
  string(18) "勤労感謝の日"
}

3. 特別な祝日を設定

<?php

use Yasumi\Holiday;
use Yasumi\Yasumi;

function isHoliday(\DateTimeInterface $currentTime, $country = 'Japan', $locale = 'ja_JP'): bool
{
    $holidays = Yasumi::create($country, (int)$currentTime->format('Y'), $locale);
    $holidays->addHoliday(new Holiday(
        'special_holiday_1',
        ['en' => 'Special Holiday', 'ja' => '特別休日'],
        new \DateTime('2020-03-21'),
        'ja_JP',
        Holiday::TYPE_OTHER
    ));

    return $holidays->isHoliday($currentTime);
}

isHoliday(new \DateTime('2020-03-21'));
  => true

終わりに

3番は意外と使い勝手いいなと思いました。 ほかにも色々あるっぽいので、使い込んでみたいです。

現場からは以上です。