最終更新: 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-021-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 |
| W | ISO-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 は変更されていない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-085. 曜日・月末・月初の取得
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-315-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:596. フォーマット変換
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; // 17472870456-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:008. 実務でよく使うパターン
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()で複製してから変更
実務経験から
よくあるトラブル例:
- タイムゾーンのミス
- サーバーがUTC、アプリが Asia/Tokyo → 9時間ズレ
- 必ず統一する
- 月末計算のバグ
- 1月31日 + 1ヶ月 = 2月28日(3月3日ではない)
- Carbonは正しく処理してくれる
- 比較時の時刻を忘れる
2026-05-15 00:00:00と2026-05-15 14:30:00は異なる- 日付のみ比較なら
isSameDay()を使う
最終更新: 2026年2月 | PHP 8.2/8.3・Laravel 12対応
あなたにおすすめの記事
PHP基礎:
Laravel関連:

