0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP/Carbonで年をまたいだ日付比較をするときのメモ

Last updated at Posted at 2025-02-03

はじめに

先日、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の記法等についてはこちらがわかりやすかったです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?