サンプル・プログラム
PHPにおける時刻の表し方
UNIX TIMEは、1970年(昭和45年)1月1日午前0時0分0秒(世界時)を0とした通算秒数である。たとえば、この原稿を書いている2009年(平成21年)8月3日21時14分3秒 (日本標準時)は、世界時で表すと同日12時15分9秒であるから、UNIX TIME は 1,249,301,709 となる。
UNIX TIME は通算秒数であるため、いちいちカレンダー計算をせずとも、日時の差分を計算できる。
そこで今回のプログラムでは、UNIT TIME を用いていく方針にする。
解説:ユーザー定数の定義
PHPの組み込み関数 define によってユーザーが定数を定義することが出来る。
ここでは、秒→分、秒→時、秒→日、秒→週(7日)、秒→月(30日)、秒→年(365日)を換算するための定数を用意する。
解説:何分前?
90: /**
91: * タイムオブジェクトを「何分前」で表示する
92: * @param int $dest 比較する時刻(UNIX TIME)
93: * @param int $sour 比較基準となる時刻(UNIX TIME)※省略可能
94: * @return string 何秒前/何分前/何時間前‥‥
95: */
96: function niceTime($dest) {
97: $sour = (func_num_args() == 1) ? time() : func_get_arg(1);
98:
99: $tt = $dest - $sour;
100:
101: if ($tt / SECYEAR < -1) return abs(round($tt / SECYEAR)) . '年前';
102: if ($tt / SECMONTH < -1) return abs(round($tt / SECMONTH)) . 'ヶ月前';
103: if ($tt / SECWEEK < -1) return abs(round($tt / SECWEEK)) . '週間前';
104: if ($tt / SECDAY < -1) return abs(round($tt / SECDAY)) . '日前';
105: if ($tt / SECHOUR < -1) return abs(round($tt / SECHOUR)) . '時間前';
106: if ($tt / SECMINUITE < -1) return abs(round($tt / SECMINUITE)) . '分前';
107: if ($tt < 0) return abs(round($tt)) . '秒前';
108: if ($tt / SECYEAR > +1) return abs(round($tt / SECYEAR)) . '年後';
109: if ($tt / SECMONTH > +1) return abs(round($tt / SECMONTH)) . 'ヶ月後';
110: if ($tt / SECWEEK > +1) return abs(round($tt / SECWEEK)) . '週間後';
111: if ($tt / SECDAY > +1) return abs(round($tt / SECDAY)) . '日後';
112: if ($tt / SECHOUR > +1) return abs(round($tt / SECHOUR)) . '時間後';
113: if ($tt / SECMINUITE > +1) return abs(round($tt / SECMINUITE)) . '分後';
114: if ($tt > 0) return abs(round($tt)) . '秒後';
115: return '現在';
116: }
先ほど定義した定数を使い、if文で力任せに場合分けしているだけである。
なお、「PHPで日本語曜日対応dateを作る」で紹介した可変長引数リストを利用し、関数 niceTime の第二引数に別の UNIX TIME を指定した場合は、現在時刻ではなく、第二引数との差を計算するようにしてある。
応用範囲が広い関数だと思うので、どうぞご自身のプログラムに組み込んで利用していただきたい。
奥が深い時刻の世界
厳密な UNIX TIME は、1970年(昭和45年)1月1日から今日までの秒数計算に24を加算しなければならない。ところが、これができる処理系は数少ない。少なくとも Windows 上の PHP では対応しておらず、Linux 上のそれでは対応しているものとそうでないもののばらつきが見られる。
つまり、このプログラムにおける「何秒前」という表記は、サーバ環境によっては最大で24秒ズレる場合があるのだ。
このように時刻の世界は奥が深い。
興味をお持ちの方は、本サイトの「時刻の話」を併せてご覧いただきたい。
参考サイト
- JavaScriptで日付をTwitter風に○分前といった表記に変換できるライブラリ「niceTime」;PHPSPOT開発日誌
- 時刻の話:ぱふぅ家のホームページ
- PHPで日本語曜日対応dateを作る:ぱふぅ家のホームページ