# Carbon で php date 日付の日数・月数差を計算
Laravel Carbon とは?
Carbon は PHP の DateTime クラスをオーバーラップした日付操作用のライブラリで、日付や時間を簡単に扱うことができます。
Laravel Carbon は、Laravel フレームワークで日付と時刻操作でよく使用されます。
Carbon 公式サイト(英語) (opens new window)
Carbon の主な機能
- 日付と時刻の演算
- フォーマットのカスタマイズ
- タイムゾーンの変更
- 日付の比較
laravel 以外の場合、まずはインストール
composer require nesbot/carbon
# Laravel で Carbon 使う
Laravel の config/app.php でタイムゾーン設定
'timezone' => 'Asia/Tokyo',
# Laravel ヘルパー利用して現在時間取得
now と today ヘルパー関数は、新しい Illuminate\Support\Carbon インスタンスを生成して現在時間取得します。
// 現在時間取得
$now = now();
// 2023-02-01 11:12:13
// 今日の日付取得
$today = today();
// 2023-02-01 00:00:00
# 日付の作成
$date = Carbon::create(2023, 2, 14);
ここで、2023 年 2 月 14 日の日付を作成しています。第 1 引数に年、第 2 引数に月、第 3 引数に日を指定します。
# 現在の日時を取得
$now = Carbon::now();
echo $now;
$dt = new Carbon('2023-04-30');
// 2023-01-30 00:00:00
$dt = Carbon::today();
// 2023-02-01 00:00:00
$dt = Carbon::tomorrow();
// 2023-02-02 00:00:00
$dt = Carbon::yesterday();
//2023-01-31 00:00:00
$dt = Carbon::parse('2023-01-31 11:12:13');
//2023-01-31 11:12:13
# インスタンスから日時を取得
$dt = Carbon::now();
echo $dt->year; // 2023
echo $dt->month; // 2
echo $dt->day; // 1
echo $dt->hour; // 11
echo $dt->minute; // 12
echo $dt->second; // 13
# 日付のフォーマット
Carbon を使ってフォーマットしたい場合は、以下のように format()メソッドを使います。
$date = Carbon::create(2023, 2, 14);
echo $date->format('Y/m/d H:i:s'); // 2023/02/14 00:00:00
format()メソッドの引数にフォーマットを指定しています。フォーマットの指定方法は、PHP の date()関数と同じです。
$dt = new Carbon('2023-12-25 14:15:16');
echo $dt->toDateString(); // 2023-12-25
echo $dt->toFormattedDateString(); // Dec 25, 2023
echo $dt->toFormattedDayDateString(); // Thu, Dec 25, 2023
echo $dt->toTimeString(); // 14:15:16
echo $dt->toDateTimeString(); // 2023-12-25 14:15:16
echo $dt->toDayDateTimeString(); // Thu, Dec 25, 2023 2:15 PM
echo $dt->format('Y年m月d日'); // 2023年12月25日
$dt = new Carbon('2023-02-01 03:45:27');
echo $dt->toAtomString(); // 2023-02-01T03:45:27+00:00
echo $dt->toCookieString(); // Friday, 01-Feb-2023 03:45:27 UTC
echo $dt->toIso8601String(); // 2023-02-01T03:45:27+00:00
echo $dt->format(DateTime::ISO8601); // 2023-02-01T03:45:27+0000
echo $dt->toISOString(); // 2023-02-01T03:45:27.612584Z
echo $dt->toJSON(); // 2023-02-01T03:45:27.612584Z
echo $dt->toIso8601ZuluString(); // 2023-02-01T03:45:27Z
echo $dt->toDateTimeLocalString(); // 2023-02-01T03:45:27
echo $dt->toRfc822String(); // Fri, 01 Feb 19 03:45:27 +0000
echo $dt->toRfc850String(); // Friday, 01-Feb-19 03:45:27 UTC
echo $dt->toRfc1036String(); // Fri, 01 Feb 19 03:45:27 +0000
echo $dt->toRfc1123String(); // Fri, 01 Feb 2023 03:45:27 +0000
echo $dt->toRfc2822String(); // Fri, 01 Feb 2023 03:45:27 +0000
echo $dt->toRfc3339String(); // 2023-02-01T03:45:27+00:00
echo $dt->toRfc7231String(); // Fri, 01 Feb 2023 03:45:27 GMT
echo $dt->toRssString(); // Fri, 01 Feb 2023 03:45:27 +0000
echo $dt->toW3cString(); // 2023-02-01T03:45:27+00:00
# 日付の加算・減算
Carbon では、日付や時間を加算・減算することができます。
$now = Carbon::now();
$now->addWeek(); // 1週間後
$now->addHours(3); // 3時間後
echo $now;
$dt = new Carbon('2012-01-31');
echo $dt->toDateTimeString(); // 2012-01-31 00:00:00
echo $dt->addCenturies(5); // 2512-01-31 00:00:00
echo $dt->addCentury(); // 2612-01-31 00:00:00
echo $dt->subCentury(); // 2512-01-31 00:00:00
echo $dt->subCenturies(5); // 2012-01-31 00:00:00
echo $dt->addYears(5); // 2017-01-31 00:00:00
echo $dt->addYear(); // 2018-01-31 00:00:00
echo $dt->subYear(); // 2017-01-31 00:00:00
echo $dt->subYears(5); // 2012-01-31 00:00:00
echo $dt->addQuarters(2); // 2012-07-31 00:00:00
echo $dt->addQuarter(); // 2012-10-31 00:00:00
echo $dt->subQuarter(); // 2012-07-31 00:00:00
echo $dt->subQuarters(2); // 2012-01-31 00:00:00
echo $dt->addMonths(60); // 2017-01-31 00:00:00
echo $dt->addMonth(); // 2017-03-03 00:00:00 equivalent of $dt->month($dt->month + 1); so it wraps
echo $dt->subMonth(); // 2017-02-03 00:00:00
echo $dt->subMonths(60); // 2012-02-03 00:00:00
echo $dt->addDays(29); // 2012-03-03 00:00:00
echo $dt->addDay(); // 2012-03-04 00:00:00
echo $dt->subDay(); // 2012-03-03 00:00:00
echo $dt->subDays(29); // 2012-02-03 00:00:00
echo $dt->addWeekdays(4); // 2012-02-09 00:00:00
echo $dt->addWeekday(); // 2012-02-10 00:00:00
echo $dt->subWeekday(); // 2012-02-09 00:00:00
echo $dt->subWeekdays(4); // 2012-02-03 00:00:00
echo $dt->addWeeks(3); // 2012-02-24 00:00:00
echo $dt->addWeek(); // 2012-03-02 00:00:00
echo $dt->subWeek(); // 2012-02-24 00:00:00
echo $dt->subWeeks(3); // 2012-02-03 00:00:00
echo $dt->addHours(24); // 2012-02-04 00:00:00
echo $dt->addHour(); // 2012-02-04 01:00:00
echo $dt->subHour(); // 2012-02-04 00:00:00
echo $dt->subHours(24); // 2012-02-03 00:00:00
echo $dt->addMinutes(61); // 2012-02-03 01:01:00
echo $dt->addMinute(); // 2012-02-03 01:02:00
echo $dt->subMinute(); // 2012-02-03 01:01:00
echo $dt->subMinutes(61); // 2012-02-03 00:00:00
echo $dt->addSeconds(61); // 2012-02-03 00:01:01
echo $dt->addSecond(); // 2012-02-03 00:01:02
echo $dt->subSecond(); // 2012-02-03 00:01:01
echo $dt->subSeconds(61); // 2012-02-03 00:00:00
# 日付の比較
Carbon では、日付や時間の大小関係を比較することができます。
$date1 = Carbon::create(2023, 3, 1);
$date2 = Carbon::create(2023, 3, 10);
if ($date1->lessThan($date2)) {
echo 'date1はdate2よりも前です。';
} else {
echo 'date1はdate2よりも後です。';
}
eq()メソッドを使って 2 つの日付が同じかどうかを判定ができます。他にも、gt()メソッド(>)、gte()メソッド(>=)、lt()メソッド(<)、lte()メソッド(<=)があります。
$dt1 = new Carbon('2016-05-01');
$dt2 = Carbon::parse('2016-05-01')->endOfYear();
// 秒
$dt1->diffInSeconds($dt2); // 21167999
// 分
$dt1->diffInMinutes($dt2); // 352799
// 時間
$dt1->diffInHours($dt2); // 5879
// 日
$dt1->diffInDays($dt2); // 244
// 週
$dt1->diffInWeeks($dt2); // 34
// 年
$dt1->diffInYears($dt2); // 0
// 2016-05-01から年末まで平日が何日あるか
echo $dt1->diffInDaysFiltered(function(Carbon $date) {
return $date->isWeekday();
}, $dt2); // 175日
echo Carbon::parse('2020-01-12 12:00:00')->diffFromYear(2019); // 1 year after
echo Carbon::parse('2020-01-12 12:00:00')->diffFromYear(2019, true); // 1 year
echo Carbon::parse('2020-01-12 12:00:00')->diffFromYear(2019, true, true); // 1yr
echo Carbon::parse('2020-01-12 12:00:00')->diffFromYear(2019, true, true, 5); // 1yr 1w 4d 12h
echo Carbon::now()->subDays(5)->diffForHumans(); // 5 days ago
echo Carbon::now()->diffForHumans(Carbon::now()->subYear()); // 11 months after
$dt = Carbon::createFromDate(2011, 8, 1);
echo $dt->diffForHumans($dt->copy()->addMonth()); // 1 month before
echo $dt->diffForHumans($dt->copy()->subMonth()); // 1 month after
echo Carbon::now()->addSeconds(5)->diffForHumans(); // 4 seconds from now
echo Carbon::now()->subDays(24)->diffForHumans(); // 3 weeks ago
echo Carbon::now()->subDays(24)->longAbsoluteDiffForHumans(); // 3 weeks
echo Carbon::parse('2019-08-03')->diffForHumans('2019-08-13'); // 1 week before
echo Carbon::parse('2000-01-01 00:50:32')->diffForHumans('@946684800'); // 50 minutes after
# Carbon インスタンス Request データ入力値の取得
日付や時刻を含む入力値は、date メソッドを用いて Carbon インスタンスとして取得できます。
$birthday = $request->date('birthday');
$elapsed = $request->date('elapsed', '!H:i', 'Asia/Tokyo');
date メソッドの第2、第3引数は、日付のフォーマットとタイムゾーンを指定できます。
date メソッドを呼び出す前に入力値をバリデーションする必要があります。