【CakePHP3】データベースから取得した日付をフォーマットして表示する方法

プログラミング
スポンサーリンク

こんにちは、とらんぽです。

CakePHP3では、date型、またはdatetime型のカラムから引き出してきた値を
そのまま画面へ表示すると「MM/DD/YY」の形で表示されます。

正直、日本人のボクには、馴染みがありません。
画像の緑マーカーで示したところは、誕生日を表示しているのですが、
1998年生まれということがパッとわかりませんよね。

今回は見慣れた「YYYY年MM月DD日」となるよう、
フォーマットする方法を調べてきたので、ご紹介します。

環境

データベース

テーブルは下記DDLで人の誕生日と給料等を登録する簡単なテーブルを用意しました。

CREATE TABLE `my_friends` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  `address` varchar(256) DEFAULT NULL,
  `email` varchar(256) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8

テンプレート

CakePHP側のテンプレートはbake allコマンドをたたいて生成されたソースをもとに変更していきます。

view.ctp

<?php
/**
 * @var \App\View\AppView $this
 * @var \App\Model\Entity\MyFriend $myFriend
 */
?>
<nav class="large-3 medium-4 columns" id="actions-sidebar">
    <ul class="side-nav">
        <li class="heading"><?= __('Actions') ?></li>
        <li><?= $this->Html->link(__('Edit My Friend'), ['action' => 'edit', $myFriend->id]) ?> </li>
        <li><?= $this->Form->postLink(__('Delete My Friend'), ['action' => 'delete', $myFriend->id], ['confirm' => __('Are you sure you want to delete # {0}?', $myFriend->id)]) ?> </li>
        <li><?= $this->Html->link(__('List My Friends'), ['action' => 'index']) ?> </li>
        <li><?= $this->Html->link(__('New My Friend'), ['action' => 'add']) ?> </li>
    </ul>
</nav>
<div class="myFriends view large-9 medium-8 columns content">
    <h3><?= h($myFriend->name) ?></h3>
    <table class="vertical-table">
        <tr>
            <th scope="row"><?= __('Name') ?></th>
            <td><?= h($myFriend->name) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Address') ?></th>
            <td><?= h($myFriend->address) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Email') ?></th>
            <td><?= h($myFriend->email) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Id') ?></th>
            <td><?= $this->Number->format($myFriend->id) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Salary') ?></th>
            <td><?= $this->Number->format($myFriend->salary) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Birthday') ?></th>
            <td><?= h($myFriend->birthday) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Created') ?></th>
            <td><?= h($myFriend->created) ?></td>
        </tr>
        <tr>
            <th scope="row"><?= __('Modified') ?></th>
            <td><?= h($myFriend->modified) ?></td>
        </tr>
    </table>
</div>

PHPでよく使う->format()でフォーマットする

PHPで日付のフォーマットと言えばこの関数ですよね。

変更前

<tr>
    <th scope="row"><?= __('Birthday') ?></th>
    <td><?= h($myFriend->birthday) ?></td>
</tr>

変更後

<tr>
    <th scope="row"><?= __('Birthday') ?></th>
    <td><?= h($myFriend->birthday->format('Y年m月d日')) ?></td>
</tr>

うまくいきました。

i18nFormat()を使う

CakePHP3で日付をデータベースから取得すると
FrozenDate型で値が取得されます。

FrozenDate型はi18nFormat()メソッドでもフォーマットできます。

変更前

<tr>
    <th scope="row"><?= __('Birthday') ?></th>
    <td><?= h($myFriend->birthday) ?></td>
</tr>

変更後

<tr>
    <th scope="row"><?= __('Birthday') ?></th>
    <td><?= h($myFriend->birthday->i18nFormat('yyyy年MM月dd日')) ?></td>
</tr>

うまくいきました。

ハイフンやスラッシュ区切りでフォーマットする

<tr>
<th scope="row"><?= __('Birthday') ?></th>
<td><?= h($myFriend->birthday->i18nFormat('yyyy-MM-dd')) ?></td>
</tr>
<tr>
<th scope="row"><?= __('Birthday') ?></th>
<td><?= h($myFriend->birthday->i18nFormat('yyyy/MM/dd')) ?></td>
</tr>

こんなかんじで、区切り文字はなんでもかけそうです。

参考サイト

日付と時刻 - 3.9
Time class helps you format time and test time.

 

 

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