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()メソッドを使うのが良さそうというのを学べましたとさ。

おしまい。

セルプロモート株式会社ではカジュアル面談を募集しているので、もし興味がある方は以下からぜひ!

event.cellpromote.biz