Carbon使っていて3月にバグがたくさん出る問題
Carbonてすごく便利ですよねー。
Carbonが何なのかはこちらの記事を読んでもらうとして、引用させてもらうと、
CarbonとはPHPのDateTimeクラスをオーバーラップした日付操作ライブラリです。
だそうです。
Laravel使いのみんなは、すでに使ってると思います。
JavaScriptだとMoment.jsは非常に使いやすいですね。
ということで今日は時間がないので本題です。
Carbonは便利なのですが、いろいろ落とし穴があって、気をつけて書かないと3月29日とか7月とかになるといろいろバグが出てきます。
ひとまず思い出したものをまとめておきます。
また思い出したら追記します。
diffInMonthなどの差分系メソッドはUTCに変換されてから計算されるため1日だと予想した結果にならない場合がある
10日とか安全な日にしてからdiffする。
Carbon::now()->subMonth()みたいにすると3/29に2月が取得できない
Carbon::now()->subMonthNoOverflow()にする。
加えるときはCarbon::now()->addMonthNoOverflow()にする。
基本、Carbon::now()からaddMonth()とsubMonth()は使ってはいけない。
※ 2017/5/23加筆:addMonthNoOverflowなどのNoOverflow系のメソッドはインスタンスをコピーして別のインスタンスを返すため、$date->subMonthNoOverflow()などのように書いた場合は必ず戻り値を元のインスタンスに代入してやる必要がある。
$date = $date->subMonthNoOverflow();
こんな感じ。
createFromFormat('Y-m', '2017-02')を指定して日付を作った場合に、現在のシステム日付が29~31だと2月が3月になってしまう
createFromFormatではなくCarbon::parse('2017-02')を使用する。
なんか他にも時間の何かがあったような気がしますが、
とりあえず以上です。