こんにちは。オガリア開発チームの粂です。
CakePHPのバージョン:2.4
CakePHPのコアライブラリCakeTimeのtimeAgoInWordsメソッドが便利です。このメソッドを使えばTwitterやFacebookのような時間表示が簡単に実現できます。
CakeTimeをビューヘルパーとして利用する方法を見ていきたいと思います。
現在日時が2013/12/02 16:00だとすると、
<?php echo $this->Time->timeAgoInWords('2013/12/02 15:59', array( 'end' => '1 year' )); ?>
⇒「1 minute ago」と表示されます。
<?php echo $this->Time->timeAgoInWords('2013/12/02 15:00', array( 'end' => '1 year' )); ?>
⇒「1 hour ago」と表示されます。
<?php echo $this->Time->timeAgoInWords('2013/11/25 16:00', array( 'end' => '1 year' )); ?>
⇒「1 week ago」と表示されます。
<?php echo $this->Time->timeAgoInWords('2013/12/01 15:00', array( 'end' => '1 year' )); ?>
⇒「1 day, 1 hour ago」と表示されます。
オプションでendに対して1 yearを指定していますが、このように設定すると1年以上前の日付は年月日の表示で出力します。
<?php echo $this->Time->timeAgoInWords('2012/12/01 16:00', array( 'end' => '1 year' )); ?>
⇒「on 1/12/12」と表示されます。
<?php echo $this->Time->timeAgoInWords('2012/12/01 16:00', array( 'format' => 'Y/m/d', 'end' => '1 year' )); ?>
⇒「on 2012/12/01」と表示されます。このようにformatを指定すれば表示形式は自由に変更できます。
さらにオプションでaccuracyを指定することで表示の正確さを調整することができます。どこまで細かく表示するかを制御できるということですね。
<?php echo $this->Time->timeAgoInWords('2012/10/01 16:00', array( 'format' => 'Y/m/d', 'end' => '1 year' )); ?>
⇒accuracyを指定しない場合。「1 month, 1 day ago」と表示されます。
<?php echo $this->Time->timeAgoInWords('2012/10/01 16:00', array( 'accuracy' => array('month' => 'month'), 'format' => 'Y/m/d', 'end' => '1 year' )); ?>
⇒accuracyを指定する場合。「1 month ago」とだけ表示されます。月より細かい表示は丸められています。
CakePHPのコアライブラリにはCakeTime以外にもCakeNumberやFile/Folderなど便利なメソッドがあります。同じことをする処理を再実装してしまってロスしないようにどんなメソッドがあるか事前に目を通しておくべきですね。
最後までお読みいただきありがとうございました!