投稿日の表示を「日時」から「〜前」に置換する【CakePHP4】

概要

記事一覧を作る際には「投稿日」を表示することが一般的です。

当ブログの記事一覧でも↓のように表示されています。

しかし、サービスによっては日付をそのまま表示するのではなく、「〜前」という表示をしたいケースもあります。

今回の記事では、年月日のデータを「〜前」と表示する方法を解説します。

前提

以下のようなarticles(記事)テーブルがあるとします。
※()内はデータ型

・id (int)
・title(varchar)
・created(datetime)

コード

src/controller/ArcitlesController.php

// src/Controller/ArticlesController.php
namespace App\Controller;

use App\Controller\AppController;

class ArticlesController extends AppController
{
    public function index()
    {
        // 記事一覧を取得
        $articles = $this->Articles->find('all');

        // ビューに渡す
        $this->set(compact('articles'));
    }
}

templates/Articles/index.php

<h1>Articles</h1>
<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Created</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($articles as $article): ?>
        <tr>
            <td><?= $article->title ?></td>
    // 日時差を計算して表示する。
            <td><?= calculateTimeDifference($article->created) ?></td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

<?php 
use Cake\I18n\FrozenTime; 
//日時差を計算する関数
function calculateTimeDifference(FrozenTime $date)
{
    $currentDateTime = FrozenTime::now();
    $timeDifference = $currentDateTime->diff($date);

    if ($timeDifference->y > 0) {
        $timeDifferenceString = sprintf("%d年", $timeDifference->y);
    } else if ($timeDifference->m > 0) {
        $timeDifferenceString = sprintf("%dヶ月", $timeDifference->m);
    } else if ($timeDifference->d > 0) {
        $timeDifferenceString = sprintf("%d日", $timeDifference->d);
    } else if ($timeDifference->h > 0) {
        $timeDifferenceString = sprintf("%d時間", $timeDifference->h);
    } else if ($timeDifference->i > 0) {
        $timeDifferenceString = sprintf("%d分", $timeDifference->i);
    } else {
        $timeDifferenceString = "0分";
    }

    return $timeDifferenceString . "前";
}
?>

これで日時が「〜前」という形で表示されます。

以下のように表示となります。

・1年以上前・・・〜年前
・1ヶ月以上前・・・〜ヶ月前
・1日以上前・・・〜日前
・1時間以上前・・・〜時間前
・1分以上前・・・〜分前
・それ以下・・・0分前

コメント

タイトルとURLをコピーしました