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

(1/1)
PHPの関数  date  では、時刻を時分秒で表示するが、Google ニュースTwitterのように、(いまから)何秒前/何分前/何時間前‥‥のように表示したいことがある。その方法をご紹介する。
プログラムを実行すると、ランダムに発生した時刻と現在時刻の差を表示する。

download プログラムを実行する

目次

サンプル・プログラム

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 を用いていく方針にする。

解説:ユーザー定数の定義

  38: //定数
  39: define('SECMINUITE', 60);                   //1分(秒)
  40: define('SECHOUR',    60 * 60);              //1時間(秒)
  41: define('SECDAY',     60 * 60 * 24);         //1日(秒)
  42: define('SECWEEK',    60 * 60 * 24 * 7);     //1週(秒)
  43: define('SECMONTH',   60 * 60 * 24 * 30);    //1月(秒)
  44: define('SECYEAR',    60 * 60 * 24 * 365);   //1年(秒)

UNIX 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  < -1return abs(round($tt / SECYEAR))    . '年前';
 102:     if ($tt / SECMONTH < -1return abs(round($tt / SECMONTH))   . 'ヶ月前';
 103:     if ($tt / SECWEEK  < -1return abs(round($tt / SECWEEK))    . '週間前';
 104:     if ($tt / SECDAY   < -1return abs(round($tt / SECDAY))     . '日前';
 105:     if ($tt / SECHOUR  < -1return 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: }

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