目次
- サンプル・プログラム
- [#php_time2gengo:解説:title=UNIX時間を元号に変換]
- 解説:jdate関数
- 参考サイト
サンプル・プログラム
解説:UNIX時間を元号に変換
0063: /**
0064: * UNIX時間を元号に変換する
0065: * @param int $time UNIX時間
0066: * @return array(元号, 年)
0067: */
0068: function time2gengo($time) {
0069: $ymd = date('Ymd', $time);
0070:
0071: if ($ymd >= 20190501) {
0072: $gengo = '令和';
0073: $year = date('Y', $time) - 2018;
0074: } else if ($ymd >= 19890108) {
0075: $gengo = '平成';
0076: $year = date('Y', $time) - 1988;
0077: } else if ($ymd >= 19261225) {
0078: $gengo = '昭和';
0079: $year = date('Y', $time) - 1925;
0080: } else if ($ymd >= 19120730) {
0081: $gengo = '大正';
0082: $year = date('Y', $time) - 1911;
0083: } else {
0084: $gengo = '明治';
0085: $year = date('Y', $time) - 1868;
0086: }
0087: return array($gengo, $year);
0088: }
UNIX時間とは、1970年(昭和45年)1月1日00時00分00秒からの累計秒数である。PHPを含め、UNIX処理系でよく用いられる。

元号は、1月1日に切り替わるわけではない。
たとえば「平成」の場合、1989年(昭和64年)1月7日に「昭和」から切り替わった。このため、昭和64年(1989年)1月7日は存在するが、昭和64年1月8日は存在せず、平成元年1月8日となる。
そこで、内部で関数 date を呼び出し、元号の切り替わりの西暦年月日かどうかで判断するようにした。
「元年」という文字列では計算しにくいので、「1年」とした。

なお、UNIX時間は1970年(昭和45年)から始まるため、実際に適用される元号は「昭和」「平成」の2つしかない。
解説:jdate関数
0090: /**
0091: * date関数拡張 - 日本語曜日名,元号に対応
0092: * ※SJISエンコードでは文字化けすることあり
0093: * @param string $formatフォーマット文字列
0094: * J : 日本語曜日名(月,火‥‥日の1文字)を返す
0095: * K : 元号(明治, 大正, 昭和, 平成)を返す
0096: * k : 元号年を返す
0097: * その他はdate 関数と同じ
0098: * @param int $timestamp UNIX TIME(省略可能;date関数と同じ)
0099: * @return stringフォーマットされた時刻(date 関数と同じ)
0100: */
0101: function jdate($format) {
0102: //英文曜日=>日本語曜日変換テーブル
0103: static $table = array('Sun' => '日', 'Mon' => '月', 'Tue' => '火',
0104: 'Wed' => '水', 'Thu' => '木', 'Fri' => '金', 'Sat' => '土');
0105:
0106: $timestump = (func_num_args() == 1) ? time() : func_get_arg(1);
0107:
0108: //日本語曜日名
0109: $str = $table[date('D', $timestump)]; //日本語曜日を計算
0110: $format = preg_replace('/J/u', $str, $format); //フォーマットを置換
0111:
0112: //元号
0113: list($gengo, $year) = time2gengo($timestump);
0114: $format = preg_replace('/K/u', $gengo, $format); //フォーマットを置換
0115: $format = preg_replace('/k/u', $year, $format);
0116:
0117: return date($format, $timestump);
0118: }

流れ的には、内部で関数 date を呼び出す。
関数 date を呼び出す前に、フォーマット文字列に 'J' があれば、これを日本語曜日に置換する。同様に、フォーマット文字列に 'K' があれば元号に、'k' があれば元号年に置換するようにした。

フォーマット文字列 'J' を曜日に変換するには、関数 date にフォーマット文字列 'D' を与え、得られる英語曜日名を日本語曜日名に変換する。この仕組みは、前回、「PHPで1ヶ月カレンダーを作る」で説明したテーブルを利用している。
このとき、関数 preg_replace を用いる。これは正規表現置換と呼ばれる手法で、その詳細は「PHPで正規表現」をご覧いただきたい。
ここでは、 変数 $format に含まれる全ての 'J' を $str に置き換える、という呪文だと覚えておいてほしい。
なお、フォーマット文字列がシフトJISであると正常に変換できないことがある。これは関数 date でも同じ事である。UTF-8 や EUC-JP であれば問題は無い。

ユーザー関数 jdate は関数 date と同様、第二引数に UNIX時間を指定できる。省略した場合には現在時刻が採用される。
PHP は、このように引数の数を不定にできる可変長引数リストという仕組みが用意されている。
ここでは、関数 func_num_args で引数の数を調べ、1個であれば現在時刻 [time]php_function] を、それ以外であれば第2引数を func_get_arg で取り出す。
参考サイト
- PHPで1ヶ月カレンダーを作る:ぱふぅ家のホームページ
- PHPで正規表現:ぱふぅ家のホームページ
- PHPでテキスト中の和暦・西暦年号を統一する(その2):ぱふぅ家のホームページ
(2021年2月6日)PHP8対応