アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

PEAR::Date_Holidays_Japanを触ってみました

皆さんは祝日は好きですか? 私は大好きです!

その祝日ですが、祝日法が改正されて日付が固定でない日が増えたため、いざ祝日を求めようとするとなかなか大変です。

祝日を求めるPEARライブラリとしてDate_Holidaysがありますが、先日PHPプロ!Weekly PEAR リリース @ 08/08/26号を見ていたら、その日本用ドライバであるDate_Holidays_Japanがリリースされてました。

ちょっと調べてみたところ、あのDo You PHP?のshimookaさまが作ってるんですね。これはぜひ使ってみるしかということで触ってみました。

まずはインストールです。まだ正式リリースではありませんので「-alpha」を付けます。



# pear install Date_Holidays_Japan-alpha


とりあえず、今年の祝日一覧を表示するスクリプトを作成してみます。

holidays.php


<?php
require_once 'Date/Holidays.php';

// インストール先のパスを指定
$filename = '/usr/share/pear/data/Date_Holidays_Japan/lang/Japan/ja_JP.xml';

$dh =  &Date_Holidays::factory('Japan', 2008, 'ja_JP');
$dh->addTranslationFile($filename, 'ja_JP');

$holidays = array();
foreach ($dh->getHolidays() as $h) {
  $holidays[$h->getDate()->format('%Y-%m-%d')] = $h->getTitle();
}
ksort($holidays);

print_r($holidays);
?>


では、実行します。



$ php holidays.php
Array
(
    [2008-01-01] => 元日
    [2008-01-14] => 成人の日
    [2008-02-11] => 建国記念の日
    [2008-03-20] => 春分の日
    [2008-04-29] => 昭和の日
    [2008-05-03] => 憲法記念日
    [2008-05-04] => みどりの日
    [2008-05-05] => こどもの日
    [2008-05-06] => 振替休日
    [2008-07-21] => 海の日
    [2008-09-15] => 敬老の日
    [2008-09-23] => 秋分の日
    [2008-10-13] => 体育の日
    [2008-11-03] => 文化の日
    [2008-11-23] => 勤労感謝の日
    [2008-11-24] => 振替休日
    [2008-12-23] => 天皇誕生日
)


今年の祝日が無事表示されました。振替休日などもきちんと対応してますね。素晴らしい!

ちなみに、2000年を指定するとこんな感じです。



Array
(
    [2000-01-01] => 元日
    [2000-01-10] => 成人の日
    [2000-02-11] => 建国記念の日
    [2000-03-20] => 春分の日
    [2000-04-29] => 昭和の日
    [2000-05-03] => 憲法記念日
    [2000-05-04] => みどりの日
    [2000-05-05] => こどもの日
    [2000-07-20] => 海の日
    [2000-09-15] => 敬老の日
    [2000-09-23] => 秋分の日
    [2000-10-09] => 体育の日
    [2000-11-03] => 文化の日
    [2000-11-23] => 勤労感謝の日
    [2000-12-23] => 天皇誕生日
)


よく見てみると、祝日の名称が今のままですね。2000年の頃は、4月29日は「みどりの日」で、5月4日は「国民の休日」のはず……。

試しに、先ほどのスクリプトへ次の処理を追加して実行してみます。



<?php
_p($dh, 1949);
_p($dh, 1989);
_p($dh, 2007);

function _p($dh, $year)
{
  $dh->setYear($year);
  echo sprintf("%s / %s / %s\n",
               $year,
               $dh->getHolidayForDate("{$year}-04-29", 'ja_JP')->getTitle(),
               $dh->getHolidayForDate("{$year}-04-29", 'C')->getTitle());
}
?>




1949 / 昭和の日 / Showa Emperor's Birthday
1989 / 昭和の日 / Greenery Day
2007 / 昭和の日 / Showa Day


英語名はその年の名称できちんと取得できてますが、日本語名は変わらないようですね。まだアルファ版ですので、そのうち修正されるものと思われます。

※一瞬のうちに修正されました! 下記コメントのパッチを適用して実行すると、


1949 / 天皇誕生日 / Showa Emperor's Birthday
1989 / みどりの日 / Greenery Day
2007 / 昭和の日 / Showa Day

のように正しく取得できます。shimookaさま、まことにありがとうございます。(2008年8月27日追記)

祝日も待ち遠しいですが、PEAR::Date_Holidays_Japanの正式リリースも待ち遠しいですね!