PHPのCarbonを正しく使う
セルプロモート株式会社で、新規自社プロダクト開発を担当してますsasamonと申します。
PHPで日付処理を実装する時によくCarbonを利用すると思うのですが、先日こんな事が起こりました。
「今月から6ヶ月分の日付を計算する処理がなんかおかしい」
コードは以下のような感じでした。
サンプル
<?php require 'vendor/autoload.php'; use Carbon\Carbon; for ($i = 0; $i < 6; $i++) { $months = new Carbon($i . 'months'); $firstday = date('Y-m-d', strtotime('first day of ' . $months)); var_dump($firstday); }
これがどうなるかというと
string(10) "2023-10-01" string(10) "2023-12-01" string(10) "2023-12-01" string(10) "2024-01-01" string(10) "2024-03-01" string(10) "2024-03-01"
特定の月だけダブって計算されてました。。。
で、なんだろうと思って調べてたのですが、ちょうどこのロジックが動いてる日が31日でした。
調べた結果以下のQiitaにたどり着いたのですが、Carbonを利用する際に月の加減算をする場合は要注意とのこと。 qiita.com
要するに月の加算時に存在しない日(11月が30日までで、31日がない)になった場合、あふれた日数を次の月に+してる。 だから11月と2月が翌月になるのねと。。。
結果以下のような感じで修正することに。
サンプル
<?php require 'vendor/autoload.php'; use Carbon\Carbon; $firstdayOfThisMonth = date('Y-m-d', strtotime('first day of this month')); for ($i = 0; $i < 6; $i++) { $firstday = Carbon::parse($firstdayOfThisMonth)->addMonthsNoOverflow($i)->toDateString(); var_dump($firstday); }
結果はこう
string(10) "2023-10-01" string(10) "2023-11-01" string(10) "2023-12-01" string(10) "2024-01-01" string(10) "2024-02-01" string(10) "2024-03-01"
Carbonを用いて月の計算をする場合はaddMonthsNoOverflow()メソッドを使うのが良さそうというのを学べましたとさ。
おしまい。
セルプロモート株式会社ではカジュアル面談を募集しているので、もし興味がある方は以下からぜひ!