# Carbon で php date 日付の日数・月数差を計算

Laravel Carbon とは?

Carbon は PHP の DateTime クラスをオーバーラップした日付操作用のライブラリで、日付や時間を簡単に扱うことができます。
Laravel Carbon は、Laravel フレームワークで日付と時刻操作でよく使用されます。

Carbon 公式サイト(英語) (opens new window)

Carbon の主な機能

  1. 日付と時刻の演算
  2. フォーマットのカスタマイズ
  3. タイムゾーンの変更
  4. 日付の比較

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 メソッドを呼び出す前に入力値をバリデーションする必要があります。

2023-02-13
  • php

同じタグを持つ記事をピックアップしました。