人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

● phpの便利な日付、時刻オブジェクト Carbon を使用する。平成、令和などの和暦を表示させる

● 文字列から Carbon オブジェクトを作成する

次のどちらもokです。

$carbon_obj = new Carbon('2019-03-11');
$carbon_obj = new Carbon('2019/03/11');

● UNIX Timestamp から Carbon オブジェクトを作成する

$carbon_obj = \Carbon\Carbon::createFromTimestamp( $v->getMTime() );

● UNIXタイムスタンプを出力する

dd(Carbon::now()->timestamp);

● 現在のタイムゾーンを取得する

echo $dt->timezone->getName();

( Asia/Tokyo )( +00:00 )のような形で返ってきます。

● 現在の Asia/Tokyo の時刻を DBで使用する文字列で取得する

echo Carbon\Carbon::now('Asia/Tokyo')->toDateTimeString()

● 年月日などを出力する

echo $dt->year;
echo $dt->month;
echo $dt->day;
echo $dt->hour;
echo $dt->minute;
echo $dt->second;
2019
5
1
10
42
28

● LaravelのBlade内で直接 Carbon を呼び出して日付を表示させる

bladeテンプレートで Carbon を呼び出すには次のように記述します。

{{ \Carbon\Carbon::now() }}
{{ \Carbon\Carbon::now()->format("Y年m月d日") }}    // 2019年03月05日
{{ \Carbon\Carbon::now()->format("Y年n月j日") }}    // 2019年3月5日
{{ \Carbon\Carbon::now()->format("Y年m月d日 H:i:s") }} // 2019年03月05日 12:30:59
{{ \Carbon\Carbon::now()->format("Y年n月j日 H:i") }} // 2019年3月5日 12:30
{{ \Carbon\Carbon::now()->format("Ymd_His_v") }} // ( v はミリ秒です )20190305_123059_699

format メソッドの引数は PHP の date と同じです。
http://php.net/manual/ja/function.date.php

● Carbonのリファレンス

https://carbon.nesbot.com/docs/

● Carbon で時刻 00:00:00 を指定する

$dt = new \Carbon\Carbon();
$dt->setTime(0, 0, 0)
dd($dt);

● 日付の指定

$dt->setDate($dt->year, $dt->month, 15);

● 日付の指定や加算で注意すること

$dt = new \Carbon\Carbon('2019-05-31');
dump( $dt->copy()->addMonth(1) );
dump( $dt->copy()->addMonthNoOverflow(1) );

 ↓ 結果

date: 2019-07-01 00:00:00.0 Asia/Tokyo (+09:00)
date: 2019-06-30 00:00:00.0 Asia/Tokyo (+09:00)

となります。addMonth() メソッドでは 6月31日がないので、7月1日になるのです。
安全のため addMonth () を 使うのを今すぐやめて addMonthNoOverflow() を使用しましょう
同じく
安全のため addYear () を 使うのを今すぐやめて addYearNoOverflow() を使用しましょう

● addMonthsNoOverflow() と addMonthNoOverflow() ( s ありと s なし)

addMonthNoOverflow は addMonthsNoOverflow を呼び出しているので、ほぼラッパーみたいな感じですが、デフォルトで引数1がセットされるので、1ヶ月だけ追加する場合はaddMonthNoOverflow() だけでもokです。

    public function addMonthsNoOverflow($value)
    public function addMonthNoOverflow($value = 1)

● 日付の加算、減算、指定

// 日付の加算(addition)
$dt->addDay();
$dt->addWeek();
$dt->addMonthNoOverflow();
$dt->addYearNoOverflow();
$dt->addHour();
$dt->addMinute();
$dt->addSecond();

// 日付の減算(subtraction)
$dt->subDay();
$dt->subWeek();
$dt->subMonthNoOverflow();
$dt->subYearNoOverflow();
$dt->subHour();
$dt->subMinute();
$dt->subSecond();

// 昨日
$dt->yesterday();

// 月初
$dt->startOfMonth();  
// 月末 の(00:00:00)  
$dt-> lastOfMonth();  
// 月末 の(23:59:59)  
$dt->endOfMonth();  

// その日の 00:00:00
$dt->startOfDay();

// その日の 23:59:59.999999
$dt->endOfDay();

// parseによる指定(来月末)
$dt->parse('last day of next month');

● Carbon で日本語の曜日を表示させる

setlocale(LC_TIME,'ja_JP.utf8');
echo $dt->formatLocalized('%Y/%m/%d(%a)');
echo $dt->formatLocalized('%Y/%m/%d(%a) %H:%M:%S')

出力例

2020/08/28(金)
2020/08/28(金) 15:41:45

● Carbonで和暦(昭和、平成、令和)を表示させる

こちら https://qiita.com/chiyoyo/items/da32649b0e04957856c1
の DatetimeUtility.php を使わせてもらいましょう

date_default_timezone_set('Asia/Tokyo');

require_once('DatetimeUtility.php');
$dt = Carbon::parse('2019-05-01');

echo DatetimeUtility::date('JK年n月j日 H:i:s', $dt->timestamp)."\n";
echo DatetimeUtility::date('Jk年n月j日 H:i:s', $dt->timestamp)."\n";

$dt->subSecond(1);
echo DatetimeUtility::date('JK年n月j日 H:i:s', $dt->timestamp)."\n";
echo DatetimeUtility::date('Jk年n月j日 H:i:s', $dt->timestamp)."\n";
令和元年5月1日 00:00:00
令和1年5月1日 00:00:00
平成31年4月30日 23:59:59
平成31年4月30日 23:59:59

● 年齢を表示させる

$dt = new Carbon('2000-01-01');
echo $dt->age . '才です';

● マシンの時計を変更する代わりに、Carbonで取得する「今日・現在」の日時を変更する

テストや障害の発生確認などの時に有用です。

Carbon::setTestNow(new Carbon('2019-11-22 11:59:59'));
No.1429
06/25 15:17

edit