nanisore oishisou

プログラマ、ララ・ベル子さん改めArm4さんのゆるふわ奮闘記。

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')を使用する。


なんか他にも時間の何かがあったような気がしますが、
とりあえず以上です。