PHPで簡単に日付操作ができるライブラリCarbon | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

アプリケーション上、日付を扱うことというのはかなり多いと思いますが、日付の比較やN日後の取得などその操作は結構面倒だったりもします。

Carbon はそういった日付操作を容易に行うことができるライブラリとなっており、導入もcomposer経由で簡単にできます。

 

 

Carbonを使ってみる

 

 

 

導入は、公式サイトに記載のとおりcomposerコマンドからインストールすることができます。

 

composerの使い方などは「[Composer] PHPのパッケージ管理にComposerを使う 」を参照。

Carbon自体はPHPのDateTimeクラス を継承する形で作られています。

 

<?php

namespace Carbon;

use Closure;
use DateTime;
use DateTimeZone;
use DateInterval;
use DatePeriod;
use InvalidArgumentException;

- snip -

class Carbon extends DateTime
{
- snip -

 

 

Carbonクラスはその中に定義されているstaticなメソッドやアクセサを使って操作します。

 

 

<?php

require 'vendor/autoload.php';
 
use Carbon\Carbon;

// 2016/03/03のオブジェクトを生成
$cb = Carbon::parse('2016-03-03 12:30:45');

// 2016年03月03日 12時30分45秒を出力
// フォーマットの書式はPHPのdate()と同じ
echo $cb->format('Y年m月d日 H時i分s秒');

// 個別に年月日時間を出力したい場合
echo $cb->year . "/" . $cb->month . "/" . $cb->day . " " . $cb->hour . ":" . $cb->minute . ":" . $cb->second;

// 1日後を表示(2016/03/04)
echo $cb->addDays(1)->format('Y/m/d');

// (この時点で2016/03/04となっているため注意)1週間前を表示(2016/02/26)
echo $cb->addDays(-7)->format('Y/m/d');

// (この時点で2016/02/26となっているため注意)1ヶ月後を表示(2016/03/26)
echo $cb->addMonths(1)->format('Y/m/d');

 

 

Carbon::parseにて、引数にセットしたい日付(引数無しの場合は今現在)を渡します。

 

表示したい場合は、formatで整形して出力といった具合です。

addDaysやaddMonthsなど(addYearsもある)でN日前後、Nヶ月前後を取得することが出来たりします。

Carbon::createにてクラスオブジェクトを生成することもできますが、こちらは引数に年月日を個別に渡すやり方になります。

 

$cb = Carbon::create(2016, 3, 3, 12, 30, 45);
echo $cb->format('Y/m/d H:i:s');

 

 

DBから取得した値をCarbonに渡すといった場合は、Carbon::parseのほうが便利かもしれません。

 

特徴的なのは、日付の比較などが簡単に行えることです。

 

// 2016/03/12の日付
$cb1 = Carbon::create(2016, 3, 12, 0, 0, 0);
// 今現在の日付
$cb2 = Carbon::today();
// 現在のコピー
$cb3 = $cb2->copy();

if ($cb1->eq($cb2)) {
    echo "日付は今日です";
} elseif ($cb1->lt($cb2)) {
    echo "日付は過去です";
} else {
    echo "日付は未来です";
}

// 1週間以内の日付かをチェックする
if ($cb1->between($cb2->addDays(-7), $cb3->addDays(1))) {
    echo "日付は1週間以内です";
}

// 1週間前からの日付差(7)を取得
echo Carbon::now()->diffInDays($cb2) . "日間の差があります";

 

 

eq(同一かどうか)、ne(同一ではないか)、lt(より小さいか)、gt(より大きいか)といった日時の比較や、betweenで指定の期間内かをチェックしています。

 

その外に、diffInDaysで日付差、diffInHoursで時間差を取得するといったことも出来ます。

 

また、その外に大きな特徴としてシステムの時刻を特定の日付にしてしまうということが出来ます。

 

これは例えば、未来の出来事でその処理が正常に行われるかのテストをしたいといった場合にとても便利です。

 

// 今日(2016/03/16)を表示
echo Carbon::now();
// 未来の日付(2020/04/01)をテスト的にセット
Carbon::setTestNow(Carbon::createFromDate(2020, 4, 1));
// 2020/04/01となっている
echo Carbon::now();
$cb = Carbon::today();
// 2020/05/01を取得できる
echo $cb->addMonths(1)->format('Y/m/d');

 

 

日付操作を全てCarbonに統一しておけば、設定の切替だけでテストが行えそうです。

 

 

このように、日付や時間を簡単に扱うことができるので、煩わしい日付操作をCarbonに任せてしまっても良いのではないでしょうか。

 

その他にも便利なメソッドも用意されているので、マニュアル も参照してください。