LoginSignup
72
62

More than 5 years have passed since last update.

投稿日時をTwitterのように「X分前」「X時間前」という文字列に変換するPHP関数

Posted at

最近のSNSは投稿日時を「X分前」「X日前」といった表記にしていることが多いですね。こういった表記がPHPで必要になったので関数作りました。

fuzzy_time.php (Gist)

関数概要

strtotime()で変換できる文字列(例:2013/2/19 22:28:03)を引数に与えると、「X日前」といった表記にして返します。返す文字列は下記の通り。

  • 1分未満はX秒前
  • 1時間未満はX分前
  • 1日未満はX時間前
  • 31日以内はX日前
  • 32日以上前の場合はX月X日といった文字列を返す。
  • 32日以上前で、現在と年が違う場合はyyyy年m月d日というように、「年」も含めて返す
fuzzy_time.php
<?php
/**
 * X秒前、X分前、X時間前、X日前などといった表示に変換する。
 * 一分未満は秒、一時間未満は分、一日未満は時間、
 * 31日以内はX日前、それ以上はX月X日と返す。
 * X月X日表記の時、年が異なる場合はyyyy年m月d日と、年も表示する
 *
 * @param   <String> $time_db       strtotime()で変換できる時間文字列 (例:yyyy/mm/dd H:i:s)
 * @return  <String>                X日前,などといった文字列
 **/
function convert_to_fuzzy_time($time_db){
    $unix   = strtotime($time_db);
    $now    = time();
    $diff_sec   = $now - $unix;

    if($diff_sec < 60){
        $time   = $diff_sec;
        $unit   = "秒前";
    }
    elseif($diff_sec < 3600){
        $time   = $diff_sec/60;
        $unit   = "分前";
    }
    elseif($diff_sec < 86400){
        $time   = $diff_sec/3600;
        $unit   = "時間前";
    }
    elseif($diff_sec < 2764800){
        $time   = $diff_sec/86400;
        $unit   = "日前";
    }
    else{
        if(date("Y") != date("Y", $unix)){
            $time   = date("Y年n月j日", $unix);
        }
        else{
            $time   = date("n月j日", $unix);
        }

        return $time;
    }

    return (int)$time .$unit;
}

ご自由にアレンジしてお使い下さいませ。

72
62
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
62