投稿日時を表示する方法
Twitterみたいに投稿から経過した時間を表示すための関数をPHPで書いていきます。
表示例
- 現在時刻が「2023-01-01 00:00:00」だった場合
- 2022-12-31 23:59:50 ->10秒前
- 2022-12-31 23:59:00 ->1分前
- 2022-12-31 23:00:00 ->1時間前
- 2022-12-30 00:00:00 ->1日前
- 2022-11-30 00:00:00 ->2022年11月30日
手順
convertToDayTimeAgo
という関数を作成し、引数の$datetime
に「2023-01-01 00:00:00」のような日時と時間を指定した文字列が挿入される想定です。
/**
* 指定した日時からどれくらい経過したかを取得
* @param string $datetime 日時
* @return string
*/
function convertToDayTimeAgo(string $datetime)
{
// ※UNIX時間とは、UTC時刻における1970年1月1日午前0時0分0秒(UNIXエポック)からの経過秒数を計算したものです。
// $datetimeには'2023-02-13 21:55:00'のような指定した日時の文字列が入ってくる想定です
$unix = strtotime($datetime);
// time関数はUNIX時刻から現在までの秒数を返します
$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;
}
strtotime($datetime)
ではUNIXタイムスタンプに置き変えています。
UNIXタイムとは1970 年 1 月 1 日 00:00:00 UTC からの経過秒数を表しているのですが、詳しくは下記のPHP公式マニュアルを確認してください。
time()
ではUNIX時刻から現在までの秒数を返します。
time()
からstrtotime($datetime)
を引くことによって(ここでは引いた数を仮に$diff_sec
とする)、現在からどれくらい経過したかを秒数で表すことができます。
以降の処理については、経過した秒数から表示する方法をif文で構成しています。
・経過した時間 < 60だった場合、〇秒前で表示
・経過した時間 < 3600(60×60)だった場合、$diff_sec
÷60→〇分前で表示
「時間前」も「日前」もこの繰り返しです。
elseでは、1ヶ月以上前の投稿、1年以上前の投稿の記述について記載しています。
最終のreturnではint型で小数点を切り捨てて、$unitに入ってきた文字列とともに表示します。