geek-logo.jpg

メモをとるのは面倒くさいし、検索するのも面倒くさい。散らかるブックマークも好きじゃない・・・そんな理由も何かにつながる

相対的な経過時間

はじめまして・・・GW中に始めた「ぼくのgeekなひとりごと・・・」は、そのタイトルの通り自分の為にgeekなことをメモしちゃおうと思います。


最近Facebookなどで見かける「何分前」、「何時間前」、「何日前」のような相対的な時間表記。

PHPの日付および時刻に関する関数に相対的な書式はサポートされてますが、記事の投稿日時などを相対的に求めたい時にどうぞ。

 1. function relative_date($ts){
 2.   $now_ts = time();
 3.   $delta = $now_ts - $ts;
 4.   if( $delta <= 60 ){
 5.     echo '1分以内';
 6.   }else if( $delta <= 86400 ){
 7.     $hours = (int)( $delta / 3600 );
 8.     $min = (int)(( $delta % 3600 ) / 60 );
 9.     if( $hours && $min ){
10.       echo $hours .'時間'. $min .'分前';
11.     }else if($hours){
12.       echo $hours .'時間前';
13.     }else if($min){
14.       echo $min .'分前';
15.     }
16.   }else if( $delta <= 604800 ){
17.     $days = (int)( $delta / 86400 );
18.     $hours = (int)( $delta % 86400 ) / 3600 );
19.     if( $days && $hours ){
20.       echo $days .'日'. $hours .'時間前';
21.     }else if($days){
22.       echo $days .'日前';
23.     }else if($hours){
24.       echo $hours .'時間前';
25.     }
26.   }else{
27.     echo date( 'Y年n月j日 H時i分', $ts );
28.   }
29. }

1行目:
相対的な経過時間を求めたい日時のタイムスタンプを受け取る関数を用意します。

2〜3行:
現在のタイムスタンプを取得し、現在のタイムスタンプと経過時刻を求めたい日時のタイムスタンプの差分を求めます。

4〜5行:
3行目で求めた差分(以下、差分)の値が60以下の場合、60秒以下ということになるので、「1分以内」を出力します。

6〜15行:
差分が86400(=60秒×60分×24時間)以下の場合、その差分は1日以内になるので、
さらに差分を3600(=60秒×60分)で割り整数にキャストすることでN時間を求めます。
さらに差分を3600(=60秒×60分)で割った余りを60で割整数にキャストすることでN分を求めます。

9〜10行:
N時間、N分共に0ではない場合、「N時間N分前」を出力します。

11〜12行:
N分が0の場合、「N時間前」を出力します。

13〜14行:
N時間が0の場合、「N分前」を出力します。

16〜25行:
差分が604800(=86400(=60秒×60分×24時間)×7日)以下の場合、その差分は1週間以内になるので、
さらに差分を86400(=60秒×60分×24時間)で割り整数にキャストすることでN日を求めます。
さらに差分を86400(=60秒×60分×24時間)で割った余りを3600で割整数にキャストすることでN時間を求めます。

19〜20行:
N日、N時間共に0ではない場合、「N日N時間前」を出力します。

21〜22行:
N時間が0の場合、「N日前」を出力します。

23〜24行:
N日が0の場合、「N時間前」を出力します。

26〜27行:
上記にも当てはまらなかった場合、「N年N月N日 N時N分」を出力します。


文字列を出力する間数echoをreturnに変更することで求めた文字列を返す関数としても使えます。

PHPを覚えるなら

初めてのPHP5 増補改訂版

新品価格
¥3,045から
(2013/5/7 15:38時点)

Posted by ひとりごとをつぶやくぼく PHP

コメント

コメントはありません。

お名前*
メールアドレス*
URL
コメント*
 

投稿されたコメントは管理者に承認された後に公開されます。

コメントする