PHP 指定された日時がどれぐらい前か調べてみる

以前にも、任意の日時からの経過時間を調べるようなものを書いたのですが、またちょっと別なアプローチでやってみようと言うことでひとつ紹介します。

PHP 2つの日付の差から経過時間を求めてみる
前にWordpressで使用されていたhuman_time_diffと言う関数を利用して件名の内容を書いたことがあったんですが、引っ越しした...

PHP 2つの日付の差から経過時間を求めてみる」では、日時Aと日時Bそれぞれの日付の差を調べて、その差から色々判断して表示形式を「%y年%mヶ月%d日経過」みたいに表示することができました。
これは色々な経過時間が考えられるケース、例えばAKBのxx期生の「お披露目日から今日まで」や「オーディションに合格してから今日まで」あるいは、「お披露目日からグループを卒業するまで」みたいな感じで任意の日付の差からどれぐらい経過しているかを調べるものでした。

今回の場合は、任意の日付(例えば2014/11/2や2014-11-2みたいなもの)をstrtotime等でunixtimeに変換してから関数に送ります。結果として返ってくるものは「何年前」、「何ヶ月前」みたいに基準は今日でぐれぐらい経過しているかを大まかに知りたい時に使える関数です。

使用方法の部分では年月日しか入っていませんが、second,minute等と日よりも小さい単位もあるので、2004/11/2 16:05等時間を設定することもできます。つまりは、「strtotimeを利用してunixtimeにできる全ての現在よりも過去の時間」が対象になるわけです。

strtotime等でunixtimeになった日付が関数に行くと、現在からその日付が引かれます。その引かれた数値に対してforの部分で「差を時間の長さ(あるいは単位)で除算代入します」。
除算代入とは、例えば差が3600だとした時、
3600/60 -> 3600/$lengths[0] -> 60 で $differenceは60となり、更にforの$jが進んで、
60/60 -> 60/$lengths[1] -> 1 で $difference には1が代入されます。
forの条件で $difference >= $lengths[$j] 差が 時間単位より大きいか同じ時とあるので、ループはここで終了になります。

このように完全に割り切れたら良いのですが、そうでない場合もあるので差を四捨五入しておきます。もし四捨五入した日付の差が1よりも大きい時は「s」をつけて、できあがった値を返すという感じです。
もし差が1時間であった時は、1hour、これが2時間になると 2hours と言うように複数で表示します。

日本語で表示する場合は特に複数形にする必要はないと思うので、

この部分はコメントアウトしておけば良いと思います。

注意点として、もし日付が未来になった場合は -xxxx.xxxxx seconds みたいな感じで表示されるかと思います。これを回避するためには、$nowより$timeが大きい場合は処理しないとか、あるいはswitch等で過去と未来の処理を切り分けるとか色々とアイデアを出さないといけないかと思います。
簡単なのは、$nowより$time(入力したunixtime)が大きい場合は「未来の時間です」と入力の間違いを示唆する値を返すのが良いかも知れません。try〜catchあたりを使うと良いかも知れませんね。

元ネタはどこで知ったのか忘れましたが、おそらく海外のサイトだったと思います。

スポンサーリンク

シェアする

フォローする