📅

PHP-Carbonで「〇ヶ月前・〇ヶ月後」を実装するとき気を付けるコト

2022/10/22に公開
2

はじめに

本業ではLaravelを用いて開発を行なっていますが、日付操作でよく「Carbon」を用いています。
最近先輩方にCarbonにて「〇ヶ月前・〇ヶ月後」を実装するにあたり、ご指摘を受けたので忘れないようにメモしておきます。

結論

結論、「〇ヶ月前・〇ヶ月後」を実装するときは以下のように実装すると、意図した実装になります。(注意点は次章にて紹介します。)

// 1ヶ月後
Carbon::parse('2022-10-31')->addMonthNoOverflow()->toDateString(); // 2022-11-30
// *ヶ月後
Carbon::parse('2022-10-31')->addMonthsNoOverflow(*)->toDateString(); // 2022-*-30

// 1ヶ月前
Carbon::parse('2022-10-31')->subMonthNoOverflow()->toDateString(); // 2022-09-30
// *ヶ月前
Carbon::parse('2022-10-31')->subMonthsNoOverflow(*)->toDateString(); // 2022-*-30

注意点

「Carbon 1ヶ月前」と検索すると、subMonth()がよく出てきますが、月末になると以下のように日付がズレてしまいます。(1ヶ月後のaddMonth()でも同様)

// 1ヶ月前
Carbon::parse('2022-10-31')->subMonth()->toDateString(); // 2022-10-01

これは「10月31日」の1ヶ月前をsubMonth()だと「9月31日」と判断され、9月は30日までなので結果「10月1日」と表示されるようです。

基本的に「〇ヶ月前・〇ヶ月後」を実装するとなると、結論で書いた方法で実装することになると思います。

さいごに

因みに本件、先輩方からご指摘されたのは2回目なので、また忘れそうな気がしたので記憶に定着させるために記事にしてみました。
皆さんの頭の片隅にこの記事が残って頂けたら嬉しいです。

参考

https://qiita.com/gungungggun/items/76e9a2a28f34a16570ff
https://zenn.dev/meijin/articles/d87e087a96978e646cc9
https://blog.capilano-fw.com/?p=867#i-2

GitHubで編集を提案

Discussion

打田裕馬打田裕馬

この記事のおかげで大変助かりました!
ありがとうございます👏

だっちだっち

わざわざコメントありがとうございます!
まさかお役に立てる記事とは思っておらず...。どんな些細なことでもアウトプットするの大事だなと改めて思いました!