PHPで日本語対応dateを作る

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

(2023年4月2日)jdateを可変長引数リストに対応

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

PHPで日本語対応dateを作る

目次

サンプル・プログラム

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

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

圧縮ファイルの内容
jdate.phpサンプル・プログラム本体。
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: }

ユーザー関数 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関数

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

ユーザー関数 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 は、引数として 可変長引数リストを使用している。
第1引数はフォーマット文字列だが、これを省略した場合には、あらかじめ用意した定数 DEF_FORMAT を参照する。第2引数はUNIX TIMEだが、これを省略した場合には  time  の値(=現在時刻)を参照する。

参考サイト

(この項おわり)
header