PHPで日本語対応dateを作る

(1/1)
PHP の関数  date  では英語曜日名や西暦の表記しかできないが、これを日本語曜日名(月、火‥‥日)と元号(明治、大正‥‥)対応させる関数を作ることにする。

(2021 年 2 月 6 日)PHP8 対応

目次

  1. サンプル・プログラム
  2. [#php_time2gengo:解説:title=UNIX 時間を元号に変換]
  3. 解説:jdate関数
  4. 参考サイト

サンプル・プログラム

プログラムを実行すると、ランダムに選ばれた 10 日分の年月日と元号、日本語曜日名を表示する。

download ダウンロード(PHP8対応)

解説: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: }

ユーザー関数 time2gengo は、UNIX 時間を元号に変換する。
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: }

ユーザー関数 jdate は、PHP の組み込み関数  date  とほとんど同じ機能を保つ。引数のフォーマット文字列に 'J' が含まれている場合のみ、これを日本語の曜日名(月、火‥‥日)に変換する。

流れ的には、内部で関数  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  で取り出す。

参考サイト

(この項おわり)
header