PHPの日付ライブラリと言えば『Carbon(カーボン)』。
PHPのDateTimeクラスを拡張したパッケージで、
日付や時間をよりシンプルに操作できるようになっています。
『Laravel』にも標準で搭載されていて、
created_atやupdated_atはCarbonインスタンスとして取得されます。
『Laravel』講座を作成するにあたり、
『Carbon』の構文をしょっちゅうググっていたので、
備忘録がてらよく使うパターンをまとめておくことにしました。
Carbonのインストール
『Laravel』を使っていれば標準でインストール済みです。
『Laravel』なしの環境ならcomposerで以下のコマンドでインストールできます。
$ composer require nesbot/carbon
Carbonの読み込み
『Laravel』ならautoload済みなのでuse文のみ記載すればOKです。
require 'vendor/autoload.php'; // Laravelの場合は不要 use Carbon\Carbon;
Cabon単独の利用
Carbonインスタンスを生成
new で生成するか 静的メソッドでも作成可能です。
$date = new Carbon(); $date = Carbon::now(); // 現在時刻
引数に文字列を指定すると、様々なインスタンスを取得できます。
new Carbon('today'); // 今日 new Carbon('tomorrow'); // 明日 new Carbon('yesterday'); // 昨日 new Carbon('now'); // 今 new Carbon('last month'); // 前の月 new Carbon('next year'); // 次の年 new Carbon('+1 day'); // 1日後 new Carbon('-2 weeks'); // 2週間前 new Carbon('+3 minutes'); // 3分後 new Carbon('-4 seconds'); // 4秒前 new Carbon('+5 years'); // 5年後 new Carbon('-6 months'); // 6ヵ月前 new Carbon('2021-01-01'); // 2021年1月1日 new Carbon('2021-01-01 01:02:03'); // 2021年1月1日 01時02分03秒
パース(解析)・・文字列からインスタンス作成
こちらでも日付データ生成可能です、引数の文字列は上と同じです。
$date = Carbon::parse('now');
日時を取得
メソッドをつなげる事で表記を変更できます。
$date = Carbon::now(); $date->year; // 2021 $date->month; // 5 $date->day; // 6 $date->hour; // 11 $date->minute; // 22 $date->second; //56 $date->format('Y年m月d日'); // 2021年05月06日 $date->dayOfWeek; // 0。週のうちの何日目か 0 (日曜)から 6 (土曜) $date->dayOfYear; // 121。年のうちの何日目か 0から開始 $date->weekOfMonth; // 1。月のうちの何週目か $date->weekOfYear; // 17。年のうちの何週目か $date->daysInMonth; // 31。 月の日数 $date->quarter; // 2。 // 四半期 $date->timestamp; //1462069596 タイムスタンプ $date->tzName; // Asia/Tokyo タイムゾーン名
日付の判定(is)
$date = Carbon::now(); var_dump($date->isToday()); // true 今日かどうか var_dump($date->isTomorrow()); // 明日かどうか var_dump($date->isYesterday()); // 昨日かどうか var_dump($date->isFuture()); // 未来かどうか var_dump($date->isPast()); // 過去かどうか var_dump($date->isLeapYear()); // うるう年かどうか var_dump($date->isWeekday()); // 平日かどうか var_dump($date->isWeekend()); // 週末かどうか デフォルトで土日が週末のよう。 // 週末の定義 $date->setWeekendDays([ Carbon::MONDAY, Carbon::TUESDAY, Carbon::WEDNESDAY, Carbon::THURSDAY, Carbon::FRIDAY, Carbon::SATURDAY, Carbon::SUNDAY, ]); // 全部設定するといつでもtrue var_dump($date->isWeekend()); // true // 同じ日かどうか var_dump($date->isSameDay(Carbon::parse('2021-05-06'))); // false var_dump($date->isSunday()); // 日曜かどうか var_dump($date->isMonday()); // 月曜かどうか var_dump($date->isTuesday()); // 火曜かどうか var_dump($date->isWednesday()); // 水曜かどうか var_dump($date->isThursday()); // 木曜かどうか var_dump($date->isFriday()); // 金曜かどうか var_dump($date->isSaturday()); // 土曜かどうか
日付の比較(gt, ltなど)
大なり、小なり、イコールなどを、
英語で greater than, lower than, equalなどの頭文字をとって、
gt, gte, lt, lte, eq, などのメソッドで実現しています。)
$date1 = new Carbon('2021-05-05'); $date2 = new Carbon('2021-06-05'); var_dump($date1->eq($date2)); // false イコール var_dump($date1->gt($date2)); // より大きい var_dump($date1->gte($date2)); // 以上 var_dump($date1->lt($date2)); // より小さい var_dump($date1->lte($date2)); // 以下 // 日付が2つの日付の間にあるか var_dump(Carbon::parse('2021-05-15')->between($date1, $date2)); // true
日時の加算・減算(add, sub)
/** 加算 **/ $date = new Carbon('2021-05-01'); $date->addDay(); // 1日後 $date->addMonth(); // 1ヶ月後(5/31の場合7/1) $date->addMonthNoOverflow(); // 1か月後(5/31の場合6/30) $date->addYear(); // 1年後 $date->addYearNoOverflow(); // 1年後(5/31の場合6/30) $date->addHour(); // 1時間後 $date->addSecond(); // 1秒後 $date->addDay(5); // 5日後 $date->addMonth(5); // 5ヶ月後 $date->addYear(5); // 5年後 $date->addHour(5); // 5時間後 $date->addSecond(5) ; // 5秒後 /** 減算 **/ $date = new Carbon('2016-05-01'); $date->subDay(); // 1日前 $date->subMonth(); // 1ヶ月前 $date->subYear(); // 1年前 $date->subHour(); // 1時間前 $date->subSecond(); // 1秒前 $date->subDay(5); // 5日前 $date->subMonth(5); // 5ヶ月前 $date->subYear(5); // 5年前 $date->subHour(5); // 5時間前 $date->subSecond(5); // 5秒前
日時の差分・相対時間 (diff)
$date1 = new Carbon('2021-05-01'); $date2 = Carbon::parse('2021-05-01')->endOfYear(); $date1->diffInSeconds($date2); // 秒 $date1->diffInMinutes($date2); // 分 $date1->diffInHours($date2); // 時間 $date1->diffInDays($date2); // 日 $date1->diffInWeeks($date2); // 週 $date1->diffInYears($date2); // 年 $date1->diffForHumans($date2); // 何日前、何ヶ月後など切り替えて表示 // 2021-05-01から年末まで平日が何日あるか $date1->diffInDaysFiltered(function(Carbon $date) { return $date->isWeekday(); }, $date2); // 175日
copyメソッド
コピーを作ることで、
元のインスタンスに影響しない方法をとる事もできます。
$date = new Carbon('2021-05-01'); // インスタンスのコピーを作る $date->copy()->subDay(); // 2021-04-30 00:00:00 // 元のインスタンスには影響がない $date->subDay(); // 2021-04-30 00:00:00
Laravelの機能との組み合わせ
LaravelのBlade内で直接Carbonを呼び出す
マスタッシュ{{}} 内に Carbon\CarbonとつければOKです。
{{ \Carbon\Carbon::now()->format("Y年m月d日") }} // 2019年03月05日
Eloquent/QueryBuilderとの組み合わせ
日付を使った検索をしたい時は、
QueryBuilder(クエリビルダ)の『whereDate』メソッドを使うと便利です。
// 等号・不等号なし $items = Item::query() ->whereDate('created_at', Carbon::today()->addMonthNoOverflow()) ->get(); // 等号・不等号あり $items = Item::query() ->whereDate('created_at', '=<', Carbon::today()->addMonthNoOverflow()) ->get();
Carbonを多用した講座をリリースしました
日付・時間の判定・計算のためにCarbonを多用したLaravel講座を作りましたので、こちらも是非ご活用いただければ幸いです。
PHP/Laravel講座
この記事へのコメントはありません。