PHPで時刻を「何分前」と表示する

(1/1)
PHP の関数  date  では、時刻を時分秒で表示するが、Google ニュースTwitterのように、(いまから)何秒前/何分前/何時間前‥‥のように表示したいことがある。その方法をご紹介する。

サンプル・プログラム

プログラムを実行すると、ランダムに発生した時刻と現在時刻の差を表示する。

プログラムを実行する

ダウンロード(PHP4/5共用)

PHPにおける時刻の表し方

PHP では、時刻を扱う方法が複数ある。その中で最も基本的なものが UNIX 時間(UNIT TIME)と呼ばれているものである。
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 を用いていく方針にする。

サンプル・プログラムの解説:ユーザー定数の定義

0018: //定数
0019: define("SECMINUITE", 60);                 //1分(秒)
0020: define("SECHOUR",    60 * 60);             //1時間(秒)
0021: define("SECDAY",     60 * 60 * 24);           //1日(秒)
0022: define("SECWEEK",    60 * 60 * 24 * 7);        //1週(秒)
0023: define("SECMONTH",   60 * 60 * 24 * 30);    //1月(秒)
0024: define("SECYEAR",    60 * 60 * 24 * 365);  //1年(秒)

UNIX TIME は桁数が大きいので、いちいちプログラムに記述するのは大変だ。そこで、決まった値を定数として定義しておこう。

PHP の組み込み関数  define  によってユーザーが定数を定義することが出来る。
ここでは、秒→分、秒→時、秒→日、秒→週(7 日)、秒→月(30 日)、秒→年(365 日)を換算するための定数を用意する。

サンプル・プログラムの解説:何分前?

0026: /**
0027:  * タイムオブジェクトを「何分前」で表示する
0028:  * @param int $dest 比較する時刻(UNIX TIME)
0029:  * @param int $sour 比較基準となる時刻(UNIX TIME)※省略可能
0030:  * @return string 何秒前/何分前/何時間前‥‥
0031: */
0032: function niceTime($dest) {
0033:     $sour = (func_num_args() == 1) ? time() : func_get_arg(1);
0034: 
0035:     $tt = $dest - $sour;
0036: 
0037:     if ($tt / SECYEAR  < -1) return abs(round($tt / SECYEAR))    . '年前';
0038:     if ($tt / SECMONTH < -1) return abs(round($tt / SECMONTH))   . 'ヶ月前';
0039:     if ($tt / SECWEEK  < -1) return abs(round($tt / SECWEEK))    . '週間前';
0040:     if ($tt / SECDAY   < -1) return abs(round($tt / SECDAY))     . '日前';
0041:     if ($tt / SECHOUR  < -1) return abs(round($tt / SECHOUR))    . '時間前';
0042:     if ($tt / SECMINUITE < -1)   return abs(round($tt / SECMINUITE)) . '分前';
0043:     if ($tt < 0)                return abs(round($tt)) . '秒前';
0044:     if ($tt / SECYEAR  > +1) return abs(round($tt / SECYEAR))    . '年後';
0045:     if ($tt / SECMONTH > +1) return abs(round($tt / SECMONTH))   . 'ヶ月後';
0046:     if ($tt / SECWEEK  > +1) return abs(round($tt / SECWEEK))    . '週間後';
0047:     if ($tt / SECDAY   > +1) return abs(round($tt / SECDAY))     . '日後';
0048:     if ($tt / SECHOUR  > +1) return abs(round($tt / SECHOUR))    . '時間後';
0049:     if ($tt / SECMINUITE > +1)   return abs(round($tt / SECMINUITE)) . '分後';
0050:     if ($tt > 0)                return abs(round($tt)) . '秒後';
0051:     return '現在';
0052: }

ユーザー関数 niceTime は、与えられた UNIX TIME と現在時刻の差をとって、その結果を、(いまから)何秒前/何分前/何時間前‥‥という文字列として返す。
先ほど定義した定数を使い、if 文で力任せに場合分けしているだけである。

なお、「PHP で日本語曜日対応 date を作る」で紹介した可変長引数リストを利用し、関数 niceTime の第二引数に別の UNIX TIME を指定した場合は、現在時刻ではなく、第二引数との差を計算するようにしてある。

応用範囲が広い関数だと思うので、どうぞご自身のプログラムに組み込んで利用していただきたい。

奥が深い時刻の世界

先ほど、「UNIX TIME は 1970 年(昭和 45 年)1 月 1 日午前 0 時 0 分 0秒(世界時)を 0 とした通算秒数」と記したが、実は、この計算は難しい。というのは、1970 年(昭和 45 年)から 2009 年までの間に 24 回の閏秒があった。
厳密な UNIX TIME は、1970 年(昭和 45 年)1 月 1 日から今日までの秒数計算に 24 を加算しなければならない。ところが、これができる処理系は数少ない。少なくとも Windows 上の PHP では対応しておらず、Linux 上のそれでは対応しているものとそうでないもののばらつきが見られる。
つまり、このプログラムにおける「何秒前」という表記は、サーバ環境によっては最大で 24秒ズレる場合があるのだ。

このように時刻の世界は奥が深い。
興味をお持ちの方は、本サイトの「時刻の話」を併せてご覧いただきたい。

参考サイト

(この項おわり)
header