【2026年最新】PHP・Laravel Carbon 日付操作完全ガイド | 比較・加算・フォーマット全網羅(Laravel 12対応)

PHP PHP
主にPHPに関する記事

最終更新: 2026年2月 | PHP 8.2/8.3・Laravel 12対応

PHPとLaravel Carbonを使った日付・時間操作の完全ガイドです。実務経験30年のエンジニアが、よく使うパターンを網羅的に解説します。

1. PHP標準の日付操作

1-1. 現在の日付・時間を取得

// 現在のUNIXタイムスタンプ
$timestamp = time();  // 1740902400

// 現在の日付・時間(フォーマット指定)
echo date('Y-m-d H:i:s');  // 2026-02-19 14:30:45

// DateTimeオブジェクト(推奨)
$now = new DateTime();
echo $now->format('Y-m-d H:i:s');

1-2. 任意の日付を作成

// 文字列から日時を生成
$date = strtotime('2026-05-01');
echo date('Y-m-d', $date);  // 2026-05-01

// DateTimeオブジェクトで作成(推奨)
$date = new DateTime('2026-05-01 15:30:00');
echo $date->format('Y-m-d H:i:s');

// 個別に指定して生成
$date = mktime(15, 30, 0, 5, 1, 2026);  // 時、分、秒、月、日、年
echo date('Y-m-d H:i:s', $date);

1-3. 日付の加算・減算

// strtotime を使う方法
echo date('Y-m-d', strtotime('+1 day'));     // 1日後
echo date('Y-m-d', strtotime('-1 week'));    // 1週間前
echo date('Y-m-d', strtotime('+1 month'));   // 1ヶ月後

// DateTimeを使う方法(推奨)
$date = new DateTime('2026-05-01');
$date->modify('+1 day');
echo $date->format('Y-m-d');  // 2026-05-02

$date->modify('-1 month');
echo $date->format('Y-m-d');  // 2026-04-02

1-4. 日付フォーマット一覧

フォーマット意味出力例
Y西暦(4桁)2026
y西暦(2桁)26
m月(ゼロ埋め)02
n月(ゼロ埋めなし)2
d日(ゼロ埋め)19
j日(ゼロ埋めなし)19
H時(24時間・ゼロ埋め)14
i分(ゼロ埋め)30
s秒(ゼロ埋め)45
l曜日(フル)Monday
D曜日(短縮)Mon
N曜日番号(1=月曜)1
w曜日番号(0=日曜)4
WISO-8601週番号08

2. Laravel Carbon 基本操作

Laravelでは、Carbonライブラリが標準で使えます。PHP標準よりも直感的で強力です。

2-1. 基本的な使い方

use Carbon\Carbon;

// 現在の日付・時間
$now = Carbon::now();
echo $now;  // 2026-02-19 14:30:45

// 今日(時間は00:00:00)
$today = Carbon::today();

// 明日・昨日
$tomorrow = Carbon::tomorrow();
$yesterday = Carbon::yesterday();

// 文字列から作成
$date = Carbon::parse('2026-05-01');
$date = Carbon::parse('2026-05-01 15:30:00');

// 個別指定で作成
$date = Carbon::create(2026, 5, 1, 15, 30, 0);  // 年、月、日、時、分、秒

2-2. イミュータブル(変更不可)vs ミュータブル(変更可)

// Carbon(ミュータブル)- 元の値が変わる
$date = Carbon::now();
$date->addDay();  // $date自体が変更される

// CarbonImmutable(イミュータブル・推奨)- 元の値は変わらない
$date = CarbonImmutable::now();
$nextDay = $date->addDay();  // 新しいインスタンスが返される
// $date は変更されていない

実務ではCarbonImmutableの使用を推奨します。

3. 日付の比較(compare dates)

3-1. 基本的な比較

$date1 = Carbon::parse('2026-04-01');
$date2 = Carbon::parse('2026-04-15');

// より小さい(前)
if ($date1->lt($date2)) {  // less than
    echo 'date1はdate2より前';
}

// より小さいか等しい
if ($date1->lte($date2)) {  // less than or equal
    echo 'date1はdate2以前';
}

// より大きい(後)
if ($date2->gt($date1)) {  // greater than
    echo 'date2はdate1より後';
}

// より大きいか等しい
if ($date2->gte($date1)) {  // greater than or equal
    echo 'date2はdate1以降';
}

// 等しい
if ($date1->eq($date2)) {  // equal
    echo '同じ日付';
}

// 等しくない
if ($date1->ne($date2)) {  // not equal
    echo '異なる日付';
}

3-2. 同じ日かチェック(isSameDay)

$date1 = Carbon::parse('2026-04-01 10:00:00');
$date2 = Carbon::parse('2026-04-01 15:30:00');

// 同じ日か(時刻は無視)
if ($date1->isSameDay($date2)) {
    echo '同じ日です';
}

// 同じ月か
if ($date1->isSameMonth($date2)) {
    echo '同じ月です';
}

// 同じ年か
if ($date1->isSameYear($date2)) {
    echo '同じ年です';
}

3-3. 過去・未来・現在のチェック

$date = Carbon::parse('2025-01-01');

// 過去か
if ($date->isPast()) {
    echo '過去の日付';
}

// 未来か
if ($date->isFuture()) {
    echo '未来の日付';
}

// 今日か
if ($date->isToday()) {
    echo '今日';
}

// 昨日か
if ($date->isYesterday()) {
    echo '昨日';
}

// 明日か
if ($date->isTomorrow()) {
    echo '明日';
}

// 今週か
if ($date->isCurrentWeek()) {
    echo '今週';
}

// 今月か
if ($date->isCurrentMonth()) {
    echo '今月';
}

3-4. 範囲内のチェック

$date = Carbon::parse('2026-05-15');
$start = Carbon::parse('2026-05-01');
$end = Carbon::parse('2026-05-31');

// 範囲内か(境界含む)
if ($date->between($start, $end)) {
    echo '範囲内';
}

// 範囲内か(境界含まない)
if ($date->between($start, $end, false)) {
    echo '範囲内(境界除く)';
}

3-5. 日数の差を計算(diffInDays)

$start = Carbon::parse('2026-04-01');
$end = Carbon::parse('2026-04-15');

// 日数の差
$days = $start->diffInDays($end);  // 14

// 絶対値で取得
$days = $start->diffInDays($end, false);  // false = 符号付き

// 時間の差
$hours = $start->diffInHours($end);  // 336

// 分の差
$minutes = $start->diffInMinutes($end);

// 秒の差
$seconds = $start->diffInSeconds($end);

// 月の差
$months = $start->diffInMonths($end);

// 年の差
$years = $start->diffInYears($end);

実務での使用例:

$birthday = Carbon::parse('1990-05-15');
$age = $birthday->diffInYears(Carbon::now());
echo "年齢: {$age}歳";

3-6. 人間が読みやすい差分表示(diffForHumans)

$date = Carbon::parse('2026-02-18');

// 現在との差分
echo $date->diffForHumans();  // "1日前"

$future = Carbon::parse('2026-02-20');
echo $future->diffForHumans();  // "1日後"

// 特定日付との差分
$start = Carbon::parse('2026-04-01');
$end = Carbon::parse('2026-04-15');
echo $start->diffForHumans($end);  // "14日前"

日本語化:

Carbon::setLocale('ja');
$date = Carbon::parse('2026-02-18');
echo $date->diffForHumans();  // "1日前"

4. 日付の加算・減算

4-1. 日付の加算

$date = Carbon::parse('2026-05-01');

// 日を加算
$date->addDay();         // 1日後
$date->addDays(5);       // 5日後

// 週を加算
$date->addWeek();        // 1週間後
$date->addWeeks(2);      // 2週間後

// 月を加算
$date->addMonth();       // 1ヶ月後
$date->addMonths(3);     // 3ヶ月後

// 年を加算
$date->addYear();        // 1年後
$date->addYears(2);      // 2年後

// 時間を加算
$date->addHour();        // 1時間後
$date->addHours(3);      // 3時間後

$date->addMinute();      // 1分後
$date->addMinutes(30);   // 30分後

$date->addSecond();      // 1秒後
$date->addSeconds(45);   // 45秒後

4-2. 日付の減算

$date = Carbon::parse('2026-05-01');

// 日を減算
$date->subDay();         // 1日前
$date->subDays(5);       // 5日前

// 週を減算
$date->subWeek();        // 1週間前
$date->subWeeks(2);      // 2週間前

// 月を減算
$date->subMonth();       // 1ヶ月前
$date->subMonths(3);     // 3ヶ月前

// 年を減算
$date->subYear();        // 1年前
$date->subYears(2);      // 2年前

4-3. イミュータブルでの加算(推奨)

$date = CarbonImmutable::parse('2026-05-01');

// 元の値は変わらない
$nextDay = $date->addDay();
$nextWeek = $date->addWeek();

echo $date;      // 2026-05-01(変わっていない)
echo $nextDay;   // 2026-05-02<br>echo $nextWeek;  // 2026-05-08

5. 曜日・月末・月初の取得

5-1. 曜日の取得

$date = Carbon::parse('2026-05-01');  // 金曜日

// 曜日番号(0=日曜、6=土曜)
echo $date->dayOfWeek;  // 5

// 曜日番号(1=月曜、7=日曜)ISO-8601形式
echo $date->dayOfWeekIso;  // 5

// 曜日名(英語)
echo $date->englishDayOfWeek;  // Friday

// 曜日名(短縮・英語)
echo $date->shortEnglishDayOfWeek;  // Fri

// 曜日名(日本語)
Carbon::setLocale('ja');
echo $date->translatedFormat('l');  // 金曜日

5-2. 週末・平日のチェック

$date = Carbon::parse('2026-05-02');  // 土曜日

// 週末か
if ($date->isWeekend()) {
    echo '週末';
}

// 平日か
if ($date->isWeekday()) {
    echo '平日';
}

// 特定の曜日か
if ($date->isSaturday()) {
    echo '土曜日';
}

if ($date->isSunday()) {
    echo '日曜日';
}

if ($date->isMonday()) {
    echo '月曜日';
}

5-3. 月初・月末の取得

$date = Carbon::parse('2026-05-15');

// 月初(00:00:00)
$startOfMonth = $date->copy()->startOfMonth();
echo $startOfMonth;  // 2026-05-01 00:00:00

// 月末(23:59:59)
$endOfMonth = $date->copy()->endOfMonth();
echo $endOfMonth;  // 2026-05-31 23:59:59

// 月初の日付のみ
echo $date->copy()->startOfMonth()->toDateString();  // 2026-05-01

// 月末の日付のみ
echo $date->copy()->endOfMonth()->toDateString();  // 2026-05-31

5-4. 年初・年末、週初・週末

$date = Carbon::parse('2026-05-15');

// 年初
$startOfYear = $date->copy()->startOfYear();  // 2026-01-01 00:00:00

// 年末
$endOfYear = $date->copy()->endOfYear();      // 2026-12-31 23:59:59

// 週初(月曜日)
$startOfWeek = $date->copy()->startOfWeek();  // 2026-05-11 00:00:00

// 週末(日曜日)
$endOfWeek = $date->copy()->endOfWeek();      // 2026-05-17 23:59:59

6. フォーマット変換

6-1. 基本的なフォーマット

$date = Carbon::parse('2026-05-15 14:30:45');

// 日付のみ
echo $date->toDateString();        // 2026-05-15

// 時刻のみ
echo $date->toTimeString();        // 14:30:45

// 日付 + 時刻
echo $date->toDateTimeString();    // 2026-05-15 14:30:45

// ISO 8601形式
echo $date->toIso8601String();     // 2026-05-15T14:30:45+09:00

// RFC 2822形式(メールヘッダーなど)
echo $date->toRfc2822String();

// UNIXタイムスタンプ
echo $date->timestamp;             // 1747287045

6-2. カスタムフォーマット

$date = Carbon::parse('2026-05-15 14:30:45');

// format() メソッド
echo $date->format('Y年m月d日');          // 2026年05月15日
echo $date->format('Y/m/d H:i:s');       // 2026/05/15 14:30:45
echo $date->format('Y-m-d (D)');         // 2026-05-15 (Fri)

// 日本語フォーマット
Carbon::setLocale('ja');
echo $date->translatedFormat('Y年m月d日 (D)');  // 2026年05月15日 (金)
echo $date->translatedFormat('Y年m月d日 (l)');  // 2026年05月15日 (金曜日)

7. タイムゾーン処理

7-1. タイムゾーンの設定

// PHP全体のタイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

// Laravel(config/app.php)
'timezone' => 'Asia/Tokyo',

// Carbonで個別に指定
$date = Carbon::now('America/New_York');
echo $date;

$date = Carbon::parse('2026-05-15 14:30:00', 'America/Los_Angeles');

7-2. タイムゾーンの変換

$tokyo = Carbon::parse('2026-05-15 14:30:00', 'Asia/Tokyo');

// ニューヨーク時刻に変換
$newYork = $tokyo->copy()->setTimezone('America/New_York');
echo $tokyo;    // 2026-05-15 14:30:00 +09:00
echo $newYork;  // 2026-05-15 01:30:00 -04:00

// UTCに変換
$utc = $tokyo->copy()->setTimezone('UTC');
echo $utc;      // 2026-05-15 05:30:00 +00:00

8. 実務でよく使うパターン

8-1. 営業日の計算

// 5営業日後を計算(土日を除く)
$date = Carbon::now();
$count = 0;

while ($count < 5) {
    $date->addDay();
    if ($date->isWeekday()) {
        $count++;
    }
}

echo $date->toDateString();

8-2. 月初から月末までのループ

$start = Carbon::parse('2026-05-01')->startOfMonth();
$end = Carbon::parse('2026-05-01')->endOfMonth();

for ($date = $start->copy(); $date->lte($end); $date->addDay()) {
    echo $date->toDateString() . PHP_EOL;
}

8-3. 有効期限のチェック

$expiryDate = Carbon::parse('2026-12-31');

if ($expiryDate->isPast()) {
    echo '有効期限切れ';
} elseif ($expiryDate->isFuture()) {
    $daysLeft = Carbon::now()->diffInDays($expiryDate);
    echo "あと{$daysLeft}日有効";
}

8-4. 年齢計算

$birthday = Carbon::parse('1990-05-15');
$age = $birthday->age;  // または diffInYears(Carbon::now())
echo "年齢: {$age}歳";

// 誕生日まであと何日
$nextBirthday = Carbon::create(Carbon::now()->year, $birthday->month, $birthday->day);
if ($nextBirthday->isPast()) {
    $nextBirthday->addYear();
}
$daysUntilBirthday = Carbon::now()->diffInDays($nextBirthday);
echo "誕生日まであと{$daysUntilBirthday}日";

8-5. データベースとの連携(Laravel)

// Eloquentモデルで自動的にCarbonインスタンスになる
$post = Post::find(1);
echo $post->created_at->diffForHumans();  // "2日前"

// 特定期間のレコード取得
$posts = Post::whereBetween('created_at', [
    Carbon::now()->subDays(7),
    Carbon::now()
])->get();

// 今日作成されたレコード
$todayPosts = Post::whereDate('created_at', Carbon::today())->get();

// 今月作成されたレコード
$thisMonthPosts = Post::whereMonth('created_at', Carbon::now()->month)
    ->whereYear('created_at', Carbon::now()->year)
    ->get();

9. チートシート(コピペ用)

9-1. 作成・取得

// 現在
Carbon::now()
Carbon::today()
Carbon::tomorrow()
Carbon::yesterday()

// 文字列から
Carbon::parse('2026-05-15')
Carbon::parse('2026-05-15 14:30:00')

// 個別指定
Carbon::create(2026, 5, 15, 14, 30, 0)

9-2. 比較

$date1->lt($date2)         // 
$date1->lte($date2)        // <=
$date1->gt($date2)         // >
$date1->gte($date2)        // >=
$date1->eq($date2)         // ==
$date1->ne($date2)         // !=

$date1->isSameDay($date2)
$date1->isPast()
$date1->isFuture()
$date1->isToday()

$date->between($start, $end)

$date1->diffInDays($date2)
$date1->diffInHours($date2)
$date1->diffForHumans()

9-3. 加算・減算

$date->addDay()
$date->addDays(5)
$date->addWeek()
$date->addMonth()
$date->addYear()

$date->subDay()
$date->subDays(5)
$date->subWeek()
$date->subMonth()
$date->subYear()

9-4. 取得

$date->dayOfWeek           // 0-6(0=日曜)
$date->dayOfWeekIso        // 1-7(1=月曜)
$date->isWeekend()
$date->isWeekday()

$date->startOfMonth()
$date->endOfMonth()
$date->startOfYear()
$date->endOfYear()

9-5. フォーマット

$date->toDateString()         // Y-m-d
$date->toTimeString()         // H:i:s
$date->toDateTimeString()     // Y-m-d H:i:s
$date->format('Y年m月d日')
$date->translatedFormat('Y年m月d日 (l)')

まとめ

覚えておくべきポイント

Carbonを使うべき理由:

  • PHP標準より直感的
  • メソッドチェーンで読みやすい
  • Laravelと完全統合

比較の基本:

  • lt(), gt(), eq() で大小比較
  • isSameDay() で日付のみ比較
  • diffInDays() で日数差を取得

実務での注意点:

  • タイムゾーンを必ず意識する
  • CarbonImmutableの使用を推奨
  • copy()で複製してから変更

実務経験から

よくあるトラブル例:

  1. タイムゾーンのミス
  • サーバーがUTC、アプリが Asia/Tokyo → 9時間ズレ
  • 必ず統一する
  1. 月末計算のバグ
  • 1月31日 + 1ヶ月 = 2月28日(3月3日ではない)
  • Carbonは正しく処理してくれる
  1. 比較時の時刻を忘れる
  • 2026-05-15 00:00:002026-05-15 14:30:00 は異なる
  • 日付のみ比較なら isSameDay() を使う

最終更新: 2026年2月 | PHP 8.2/8.3・Laravel 12対応

あなたにおすすめの記事

PHP基礎:

Laravel関連:

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