はじめに
先日、Laravel(PHP)プロジェクトで日付比較に関する興味深いバグに遭遇しました。
一見シンプルな日付比較のロジックでしたが、Carbonの日付解析の仕様により予期せぬ動作となってしまいました。同じような問題で悩む方の助けになればと思います。
問題の概要
月/日(m/d)フォーマットの日付文字列をCarbonオブジェクトに変換する際、年の指定がないことにより想定外の年が自動設定され、日付比較が正しく機能しない問題が発生しました。
問題のあるコード
// 配送予定日(m/dフォーマット)をCarbonオブジェクトに変換
$deliveryDate = Carbon::createFromFormat('m/d', $scheduleData['delivery_date']);
// 基準日との比較
return $deliveryDate->gt($baseDate); // 誤った比較結果を返してしまう
何が起きていたのか?
-
m/d
フォーマットのみでCarbonオブジェクトを作成すると、デフォルトで現在の年ではなく2025年として解釈されるという動作でした。 - これにより、以下のような誤った比較が発生:
// 例: // 基準日:2024-12-08 // 配送予定日:2025-11-12("11/12"から自動的に2025年として解釈)
- 結果として、配送予定日が常に未来の日付として判定されてしまいました
修正後のコード
// 基準日の年を明示的に設定してCarbonオブジェクトを作成
$deliveryDate =
Carbon::createFromFormat('m/d', $scheduleData['delivery_date'])
->year($baseDate->year); // 基準日と同じ年を設定
return $deliveryDate->gt($baseDate); // 正しい比較が可能に
参考
Carbonの記法等についてはこちらがわかりやすかったです。