サンプル・プログラムの実行例

サンプル・プログラム
jdate.php | サンプル・プログラム本体。 |
バージョン | 更新日 | 内容 |
---|---|---|
2.3 | 2023/04/02 | jdateを可変長引数リストに対応 |
2.2 | 2021/02/06 | PHP8対応 |
2.1 | 2019/04/01 | 新元号「令和」追加 |
2.0 | 2015/02/08 | ereg系関数をpreg系関数に代替 |
2.0 | 2009/08/22 | 元号に対応した |
解説:UNIX時間を元号に変換
65: /**
66: * UNIX時間を元号に変換する
67: * @param int $time UNIX時間
68: * @return array(元号, 年)
69: */
70: function time2gengo($time) {
71: $ymd = date('Ymd', $time);
72:
73: if ($ymd >= 20190501) {
74: $gengo = '令和';
75: $year = date('Y', $time) - 2018;
76: } else if ($ymd >= 19890108) {
77: $gengo = '平成';
78: $year = date('Y', $time) - 1988;
79: } else if ($ymd >= 19261225) {
80: $gengo = '昭和';
81: $year = date('Y', $time) - 1925;
82: } else if ($ymd >= 19120730) {
83: $gengo = '大正';
84: $year = date('Y', $time) - 1911;
85: } else {
86: $gengo = '明治';
87: $year = date('Y', $time) - 1868;
88: }
89: return array($gengo, $year);
90: }
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関数
92: /**
93: * date関数拡張 - 日本語曜日名,元号に対応
94: * ※SJISエンコードでは文字化けすることあり
95: * @param string $format フォーマット文字列(省略可能)
96: * J : 日本語曜日名(月,火‥‥日の1文字)を返す
97: * K : 元号(明治, 大正, 昭和, 平成,令和)を返す
98: * k : 元号年を返す
99: * その他は date 関数と同じ
100: * @param int $timestamp UNIX TIME(省略可能;date関数と同じ)
101: * @return string フォーマットされた時刻(date 関数と同じ)
102: */
103: function jdate(...$params) {
104: //英文曜日=>日本語曜日変換テーブル
105: static $table = array('Sun' => '日', 'Mon' => '月', 'Tue' => '火',
106: 'Wed' => '水', 'Thu' => '木', 'Fri' => '金', 'Sat' => '土');
107:
108: //引数の初期値
109: $format = DEF_FORMAT;
110: $timestump = time();
111: //可変長引数リストの処理
112: foreach ($params as $key=>$val) {
113: switch ($key) {
114: //1番目の引数 = $format
115: case 0:
116: $format = $val;
117: break;
118: //2番目の引数 = $timestump
119: default:
120: $timestump = $val;
121: break;
122: }
123: }
124:
125: //日本語曜日名
126: $str = $table[date('D', $timestump)]; //日本語曜日を計算
127: $format = preg_replace('/J/u', $str, $format); //フォーマットを置換
128:
129: //元号
130: list($gengo, $year) = time2gengo($timestump);
131: $format = preg_replace('/K/u', $gengo, $format); //フォーマットを置換
132: $format = preg_replace('/k/u', $year, $format);
133:
134: return date($format, $timestump);
135: }

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

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

ユーザー関数 jdate は、引数として 可変長引数リストを使用している。
第1引数はフォーマット文字列だが、これを省略した場合には、あらかじめ用意した定数 DEF_FORMAT を参照する。第2引数はUNIX TIMEだが、これを省略した場合には time の値(=現在時刻)を参照する。
参考サイト
- PHPで1ヶ月カレンダーを作る:ぱふぅ家のホームページ
- PHPで正規表現:ぱふぅ家のホームページ
- PHPでテキスト中の和暦・西暦年号を統一する(その2):ぱふぅ家のホームページ
(2023年4月2日)jdateを可変長引数リストに対応