PHP で和暦変換をするライブラリを作った

openpear がしばらくはてな ID でログインできなかったけど、昨日復活したと中の人が言ってたので復活記念としてリリースw


PHP で和暦変換する必要があったので、ライブラリが無いかと思って探したけど無かった。
時間がなくて結局ベタに実装したけど、あったら便利なのかなぁと思って和暦変換をする Date_Japanese_Era を作った。
http://openpear.org/package/Date_Japanese_Era


PerlDate::Japanese::Era をポーティングした感じ*1

<?php
$era = new Date_Japanese_Era(array(2009, 7, 11));
echo $era->name; // 平成
echo $era->gengou; // name のエイリアス
echo $era->year;   // 21
echo $era->nameAscii; // heisei

$era = new Date_Japanese_Era(array('平成', 21));
echo $era->gregorianYear; // 2009

元号のテーブルは Perl の Date::Japanese::Era::Table と同じく Date_Japanese_Era_Table に static なフィールドとして持ってる。
新しく元号が増えたらこのテーブルを更新すれば良い。
デフォルトの年号以外を使いたい場合は、 Date_Japanese_Era_Table::$ERA_TABLE; を上書きすれば良い。

<?php
$data = array(
    '慶応' => array('keiou', 1865, 4, 7, 1868, 9, 7)
);
Date_Japanese_Era_Table::$ERA_TABLE = $data;
$era = new Date_Japanese_Era(array(1865, 4, 7));
echo $era->name; // 慶応

内部的には明治元年 (1868/9/8)とか明治 6 年 (1873/1/1)*2はタイムスタンプに変換したら false になったので、しょうがないので文字列比較してる。
こういう比較で判定できるのはキモイw
なので、1868/9/8 も変換できる。
なお存在しない日付 / 年号を入れたら例外が発生する。

<?php
try {
   $era = new Date_Japanese_Era(array('昭和', 65));
} catch (Date_Japanese_Era_Exception $e) {
    // 例外
}

PHP で和暦変換するというニーズはあまりないと思うけど需要がある場合は是非ご利用下さい。

*1:平成二十一年とか日本語からの変換は未サポート

*2:日本で太陽暦を採用したのは 1873 年から