有効期限を変更したいときなどに便利なaddDays・addMonths
Larave(Carbon)で日付の有効期限などを計算する際に非常によく使われる、日付操作ライブラリのCarbonメソッドについて説明します。
直観的で便利なメソッドですので、基本から応用、注意点まで丁寧に理解しましょう。
基本的な使い方
use Illuminate\Support\Carbon;
// 現在の日時を取得
$now = Carbon::now();
// 3日後(有効期限を3日間延長など)
$expiryDate = $now->copy()->addDays(3);
// 2か月後(月額プランの次回更新日など)
$nextBillingDate = $now->copy()->addMonths(2);
重要ポイント:copy()を挟む理由
Carbonオブジェクトは標準では破壊的(Mutable)です。$now->addDays(3)を書くと、$now自体の日付が3日後に書き換わってしまいます。「現在日時」を保持したまま計算したい場合は、必ず$now->copy()->addDays(3)のようにcopy()を挟みましょう。
便利な関連メソッド一覧
addDays(x)→X日後
subDays(x)→X日前
addMonths(x)→Xか月後
addYears(x)→X年後
addHours(x)→X時間後
実務で使える有効期限のパターン
有効期限を設定する際の、「時間の部分をどう扱うか」が落とし穴になりがちです。
パターンA:〇日後の「23時59分59秒」まで有効にしたい
「今日から3日間有効」という場合、3日後の23:59:59まで使えたほうが親切です。その場合はendOfDay()を合わせます。
$expiry = Carbon::now()->copy()->addDays(3)->endOfDay();
// 3日後の3日後の23:59:59まで
パターンB:〇日後の「その瞬間」まで有効にしたい
パスワードリセットのURLの有効期限など、セキュリティが絡む場合は時間をそのまま引き継ぎます。
$expiry = Carbon::now()->copy->addHours(24);
// 2026/07/02 10:00の場合、2026-07-03 10:00:00
注意点:addMonthsの「月末問題」
addMonthsを使うとき、1つだけ仕様上の注意点があります。それは月末に実行した場合の挙動です。
1月31日の「1か月後」を表したいとき、addMonths(1)を使うと、Carbonは「2月31日」を探しますが、2月は28日までしかありません。そのため、あふれた分が計算されて3月3日になってしまいます。
解決策としては、addMonthsNoOverflowを使う方法があります。
「1月31日の1か月後は、2月の末日(2月28日)になってほしい」というビジネス路軸の場合は、addMonthsNoOverflowを使います。
$data = Carbon::create(2026, 1, 31); // 2026-01-31
echo $data->copy()->addMonths(1); // 2026-03-03 echo $data->copy()->addMonthsNoOverflow(1); // 2026-02-28
サブスクリプションの決済日や、毎月の月末締めのような処理を作る場合は、このNoOverflowシリーズを使うのが安全です。
株式会社オートプロジェクトでは、バックエンド全般を安心してお任せいただけます。
サーバー設定やDB管理、セキュリティ対策など幅広いニーズに対応いたします。お気軽にご相談ください。

EC用公式アカウント