カテゴリー

月別過去記事

みるくぜりー内 検索
Loading

[PHP]CarbonでaddMonthsは思った動きをしないのでaddMonthsNoOverflowを使おう!

とある日の数ヶ月後を取りたく、CarbonのaddMonthsを使っていたのですが、
なんか日付おかしいっぽいよ??との報告を受けて嫌な予感がする…なと調べてみた。

想定していないケースが起きていたコード
1月30日の1ヶ月後は月末の2月28日であってほしいのに3月2日になる。
echo Carbon::parse('2017/01/30')->addMonths(1);
// 2017-03-02 00:00:00


んじゃ、どうすればいいのか?調べてみていたら発見したのがこの記事。
Carbon::addMonths() vs Carbon::addMonthsNoOverflow() and mutability
addMonthsNoOverflowとはなんぞや??
これってもしかして思ってた動きをするのでは?ということで試してみた。

echo Carbon::parse('2017/01/30')->addMonthsNoOverflow(1);
// 2017-02-28 00:00:00
echo Carbon::parse('2017/01/31')->addMonthsNoOverflow(1);
// 2017-02-28 00:00:00
echo Carbon::parse('2017/03/31')->addMonthsNoOverflow(1);
// 2017-04-30 00:00:00

これだよーーーこれ!!!

2ヶ月後の数値を取りたい場合も難なくクリア
echo Carbon::parse('2017/01/31')->addMonthsNoOverflow(2);
// 2017-03-31 00:00:00
echo Carbon::parse('2017/03/31')->addMonthsNoOverflow(2);
// 2017-05-31 00:00:00


というわけで、addMonthsを使う場合は起点となる日付が29日、30日、31日の場合は
想定と違う動きをする可能性があるので純粋に○ヶ月後を取りたい人はオーバーフローしない
addMonthsNoOverflowを使いましょうというお話でした。

ちなみにRubyのactive supportは大丈夫か?と会社の同僚がささっと調べてみてくれたのですが
問題無く動作しているとのこと。そりゃそうだ〜〜。


コメント
コメントする








   
この記事のトラックバックURL
トラックバック