Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PEAR::Date_Holidays_Driver_Japanese 0.2.2

華麗に突っ込まれてました><


正確に言うと、Date_Holidays_Driver_Japanese::setYear()の挙動が変。
         :
setYear()を使うと振替休日と国民の休日だけ表示されないので、Date_Holidays_Driver_Japaneseがおかしいのかな?って思ったりもしたんですが、内部名が初期化されていないのはDate_Holidays_Driverもおかしい気がしないでもないのですが、今眠くて深追いする気が起きません(ぉぃ。
         :
解決策としては、西暦が変わったら、オブジェクトを新規に生成しなおすのが早そうです。

Date_Holidays_Driverクラスは内部で事ある毎にsetYearメソッドをコールして、内部で保持している祝日情報の再構築を頻繁にやっています。今回の件ですが、setYearメソッドで祝日の再構築をした際、当該年に存在する祝日以外の翻訳データを削除していたことが直接の原因です(Date_Holidays_Driverクラス内)。ただ、getHolidayForDateメソッドでロケールを指定しない場合はちゃんと値が返ってきます。

<?php
$lastYear = 0;
$beginTime = mktime(0, 0, 0, 1, 1, 2008);
for ($i = 0; $i <731; $i++) {$holiday = $obj->getHolidayForDate($d);   // ロケールを指定しない}

つーか、そもそも内部で

  • 日付
  • 祝日名称
  • 内部名称

を別々の配列で格納してるのってどうかと思ってはいるんですが。。。;-)


ということで、バージョン0.2.2をリリースします。更新内容は以下の通りです。

  • 翻訳データを登録した、かつ、setYear()した場合に、getHolidayForDate()が正しい値を返さない不具合を修正(thanks id:uechoco
    • かなり強引ですが、毎回1から構築し直すようにしました

インストールは

$ sudo pear install -af http://www.doyouphp.jp/pear/Date_Holidays_Driver_Japanese-0.2.2.tgz

アップグレードは

$ sudo pear upgrade -af http://www.doyouphp.jp/pear/Date_Holidays_Driver_Japanese-0.2.2.tgz

な感じで。コード一式はCodeReposからどうぞ。

追記(2008/08/24 14:20)

PEAR::Date_Holidays_Driver_JapaneseはPEAR::Date_Holidays_Japanとして本家PEARに登録されました。