phpで 投稿日時からの経過日時の表示

Twitterなどでよく見られる最新投稿からどれくらい時間が経っているのかの表示する
「50秒前」
とか
「6時間前」
みたいな表示をphpで表示する方法を知ったのでメモします。


例えば、データベースの投稿を管理するテーブルから以下のような投稿時間を取得したとします。
(MySQLから投稿日時を得たならだいたいフィールドの型はTIMESTAMP型だという想定)

2013-06-13 22:38:16

この投稿日時から現在までに経過した秒数、及び日時を表示するためには以下の通りに書くととりあえずうまくいきました。

<?php
$time = '2013-06-13 22:38:16';
$spltime = preg_split("/[ :-]/", $time);//正規表現を用いて第1引数に該当する文字列で配列化
//MacOSの空白だとこう。windowsの空白だとpreg_split("/[¥s:-]");かも?
$post_time = mktime($spltime[3],$spltime[4],$spltime[5],$spltime[1],$spltime[2],$spltime[0]);
//配列化された文字列を使って1970年1月1日0時0分0秒からの経過秒数を算出
//mktime(時,分,秒,月,日,年)の順で入れると秒数を返してくれる。

$cur_time = time();//1970年1月1日0時0分0秒から現在までの経過秒数を算出
$dif_time = $cur_time - $post_time;//現在時刻と$timeで得た時刻の差の計算

if($dif_time < 60){
	echo floor($dif_time)."秒前";//差が60秒より小さければ秒数を表示
}else if($dif_time <= 3600){//1時間は3600秒なので分が出せる
	echo floor($dif_time / 60)."分前";//floor関数で端数切捨て
}else if($dif_time <= 3600*24){//1日は3600×24秒なので時間が出せる
	echo floor($dif_time / 3600)."時間前";//floor関数で端数切捨て
}else if($dif_time <= 3600*24*365){//1年は3600*24*365なので日数が出せる
	echo floor($dif_time / (3600*24))."日前";//floor関数で端数切捨て
}
?>

これで一応、経過日数までは表示できます。
恐らく他にもいくらでも効率のいい方法があるはずです。

ちなみにtime関数やmktime関数はブラウザ上でエラーを発していなくてもapache(Webサーバー)のエラーログ上ではエラーを発していることがあります。この手のことが分かる人ははエラー文上でどこを直すべきか分かるでしょう。

参考
PHP:time(1970/1/1 0:00:00から現在日時までの経過秒数を返す)
PHP:mktime(1970/1/1 0:00:00から指定された引数によって得られた日時からの経過秒数を返す)
PHP:preg_split
PHP:floor