CarbonのlastOfMonth()がバグの原因になっていました

1 min read読了の目安(約1000字

Laravelで標準装備されているCarbonという日付操作のライブラリがあります。

僕は今月末の日付を取得したい場合に「lastOfMonth」を頻繁に使用していました。
しかし、この「lastOfMonth」を使用したことでバグが発生しました。

実際に本番環境に上げる前に気づいたので問題はなかったのですが、なかなか気づきにくいバグだったので残しておきます

lastOfMonthが原因で発生していたバグ

lastOfMonthは月末を指すのですが、もっと正確に言うと実際には月の最終日の開始時刻を指します。

例えば、2021年5月であれば 2021年5月31日00時00分00秒 を指すみたいです。僕はここの認識を間違っていました。

僕はlastOfMonthを使用して、 「今月の1日~末日までのデータを取得する」という処理を書いていたのですが、5月31日分のデータが返ってこないというバグが発生していました

つまり5月1日00時00分00秒〜5月31日00時00分00秒の間のデータを取得するという処理なので、 5月31日分は考慮されていないわけですね。

解決策

基本的に月末の開始時刻を取得したい場面はないと思うので、基本的に endOfMonthを使用しましょう。

endOfMonthなら月末の終了時刻(5月なら、5月31日23時59分59秒)を返してくれます。

ちなみに、年も同様でlastOfYearとendOfYearがあります。
2021年を例にすると、lastOfYearは 2021-12-31 00:00:00 endOfYearは 2021-12-31 23:59:59 となります

終わりに

大体の場合はlastOfMonthを使わずにendOfMonthの方が良いんじゃないかと思います。いずれにせよ正しく理解しておく必要があると感じました。

ちなみに月初を表す startOfMonthをfirstOfMonthは両方挙動は全く同じで、5月の場合は 2021-05-01 00:00:00 を返してくれます。

挙動は同じなのでどちらを使用してもいいのですが、endOfMonthを使うときはstartOfMonth, lastOfMonthを使うときはfirstOfMonthと対称関係を意識して使うようにしました。