株式会社オートプロジェクト

有効期限を変更したいときなどに便利なaddDays・addMonths

有効期限を変更したいときなどに便利な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シリーズを使うのが安全です。

Webデザイナー / コーダーのみなさまへ

株式会社オートプロジェクトでは、バックエンド全般を安心してお任せいただけます。

サーバー設定やDB管理、セキュリティ対策など幅広いニーズに対応いたします。お気軽にご相談ください。

バックエンドについて、オートプロジェクトに問い合わせをする

Contact ご相談・お問い合わせ

実現の可否や概算費用、納期に関するご質問・ご相談も、
どうぞご遠慮なくお問い合わせください。

TOP