[php / laravel]carbonの使い方について

Laravel

業務でLaravel6を使うことになり、carbonをよく使うことになりそうなので、使い方についてまとめてみました。

carbonとは

phpで日付・時刻を扱うためのライブラリになります。
phpそのままで日付・時刻を扱うよりも、比較したり、足したり、引いたり・・・
もっと簡単に使えるようになります。

carbonのgithubはこちら
carbon公式ページはこちら

laravelでcarbonを使うには

laravelにはデフォルトでcarbonが入っているので、下記のようにuseで定義するだけで使うことができます。

use Carbon\Carbon;

日本時間にするには

php.iniのtimezoneを変更しても反映されないんだけど??

php.iniのタイムゾーンを

date.timezone="Asia/Tokyo"

としてもCarbon(Laravel)で取得する時間が、UTCになっているようでした。

config/app.phpを修正する必要がある

Laravelのconfig/app.phpファイルの70行目くらいに

'timezone' => 'UTC',

上記の記述があるので、下記になおすと解決します。

'timezone' => 'Asia/Tokyo',

carbonのインスタンス定義

carbonはインスタンスを作って日付を取ったり、足し込んだりします。
下記がインスタンス作成のやり方です。

newで作る

newで作ると、現在日付のインスタンスができます。

$cb = new Carbon();
echo $cb; // 2020-05-20 14:13:30

日付・時刻を指定して作ることも出来ます。

$cb = new Carbon("2020-05-21 12:12:00");
echo $cb; // 2020-05-21 12:12:00

staticで作る

nowでも同じように、現在日付のインスタンスができます。

$cb = Carbon::now();
echo $cb; // 2020-05-20 14:13:30

昨日・今日・明日のインスタンス作成

作ったcarbonのインスタンスから、staticなメソッド呼び出しで、昨日・今日・明日のインスタンスが作成できます。
時分秒は00:00:00になります。

$cb = new Carbon();

// 昨日
echo $cb::yesterday(); // 2020-05-19 00:00:00

// 今日 
echo $cb::today(); // 2020-05-20 00:00:00

// 明日
echo $cb::tomorrow(); //2020-05-21 00:00:00

日付・時刻の取得

インスタンスから年月日や時分秒を取得するには下記のように書きます。

$cb = new Carbon(); // 2020-05-20 14:47:36

// 年
echo $cb->year; // 2020

// 月
echo $cb->month; // 5

// 日
echo $cb->day; // 20

// 時
echo $cb->hour; // 14

// 分
echo $cb->minute; // 47

// 秒
echo $cb->second; // 36

日付・時刻の比較

同じ日付の判定

同じ日付か判定するときはequalToメソッドを使います。

$cb1 = new Carbon("2020-05-01");
$cb2 = new Carbon("2020-05-02");
$cb3 = new Carbon("2020-05-01");

// 同じか比較する
var_dump($cb1->equalTo($cb2)); // bool(false)
var_dump($cb1->equalTo($cb3)); // bool(true)

上記の例では$cb1と$cb2は違う日付なのでfalseですが、
$cb1と$cb3は同じ日付なのでtrueになっています。

より大きい日付の判定

gtメソッドを使います。
このメソッドは [a > b] となり、同じ日付は含まず。bよりaが大きいとなります。

$cb1 = new Carbon("2020-05-01");
$cb2 = new Carbon("2020-05-02");

$cb2->gt($cb1); // true

上記で言うと、$cb1より$cb2が大きい(cb2はcb1より未来日)のでtrueになっています。

未満の判定

ltメソッドを使います。
このメソッドは [a < b] となり、同じ日付は含まず。aはb未満となります。

$cb1 = new Carbon("2020-05-01");
$cb2 = new Carbon("2020-05-02");

var_dump($cb1->lt($cb2)); // true

上記で言うと、$cb1は$cb2未満(cb1はcb2より過去日)なのでtrueになっています。

以上の判定

gteメソッドを使います。
gtと同じような感じですが、同値もtrueになります。
([a >= b]となる)

$cb1 = new Carbon("2020-05-01");
$cb2 = new Carbon("2020-05-02");
$cb3 = new Carbon("2020-05-01");

var_dump($cb2->gte($cb1)); // true
var_dump($cb1->gte($cb3)); // true

以下の判定

lteメソッドを使います。
ltと同じような感じですが、同値もtrueになります。
([a <= b]となる)

$cb1 = new Carbon("2020-05-01");
$cb2 = new Carbon("2020-05-02");
$cb3 = new Carbon("2020-05-01");

var_dump($cb1->lte($cb2)); // true
var_dump($cb1->lte($cb3)); // true

日付・時刻の加算

加算はインスタンスからのadd関連メソッドを使って行います。

それぞれ対応するメソッドが下記になります。
addYear:年
addMonth:月
addDay:日
addHour:分
addMinute:時
addSecond:秒

$cb1 = new Carbon("2020-05-01");
echo $cb1->addYear(2); // 2022-05-01 00:00:00
echo $cb1->addYear(); // 2023-05-01 00:00:00

echo $cb1->addMonth(2); // 2023-07-01 00:00:00
echo $cb1->addDay(2); // 2023-07-03 00:00:00

echo $cb1->addHour(2); // 2023-07-03 02:00:00
echo $cb1->addMinute(20); // 2023-07-03 02:20:00
echo $cb1->addSecond(20); // 2023-07-03 02:20:20

例で上記のように書いてみました。

同じインスタンスに対して、addしていくと足し込まれてますね。
メソッドに足したい数を渡してもいいですが、渡さない場合は最小単位が足し込まれるみたいです。

日付・時刻の減算

加算と同じように減算のときはインスタンスのsub関連メソッドを使って行います。

それぞれ対応するメソッドが下記になります。
subYear:年
subMonth:月
subDay:日
subHour:分
subMinute:時
subSecond:秒

addのところをsubに変えただけですね😂

$cb1 = new Carbon("2020-05-01");
echo $cb1->subYear(2); // 2018-05-01 00:00:00
echo $cb1->subYear(); // 2017-05-01 00:00:00

echo $cb1->subMonth(2); // 2017-03-01 00:00:00
echo $cb1->subDay(2); // 2017-02-27 00:00:00

echo $cb1->subHour(2); // 2017-02-26 22:00:00
echo $cb1->subMinute(20); // 2017-02-26 21:40:00
echo $cb1->subSecond(20); // 2017-02-26 21:39:40

なので、上記のように同じように書いてみました。
今度はしっかり引かれているのが確認できました!

最後に

比較も加算も楽に処理できて、便利ですね!

コメント

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