31
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP/Laravel】Carbonでの日付の扱い(加算・減算)にはご注意!

Last updated at Posted at 2022-12-21

はじめに

Carbonは、PHPで日付や時刻を扱う処理を簡単にするためのライブラリです。
Laravelには標準搭載されています。

想定読者

PHP/Laravel初学者

開発環境・前提

開発環境

  • OS:Windows11 22H2
  • PHP 8.2.0
  • Laravel 9.44.0

前提

  • ローカルにLaravel開発環境があること。

(今回の検証用)
作成したデフォルトのLaravelプロジェクトにおいて、以下の各ディレクトリにファイルをそれぞれ配置。
ファイル名は任意。

  • app\Http\Controllers\MonthController.php
  • resources\views\month.blade.php

ソースコード(該当箇所のみ)

MonthController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Carbon\Carbon;

class MonthController extends Controller
{
    public function month() 
    {
        $month = new Carbon('20220331');
        $month->subMonth();

        return view('month')->with('month', $month);
    }
}
month.blade.php
/* bodyタグの間に記述(ブラウザに日時を表示させるための記述)*/
<h1>{{ $month }}</h1>
web.php
/* デフォルトのルーティングに以下を追記 */
Route::get('month', [App\Http\Controllers\MonthController::class, 'month']);

実装内容の解説

use Carbon\Carbon;

このuse宣言をMonthController.phpに追記することで、MonthController内でCarbonを用いた処理を行えるようになります。

$month = new Carbon('20220331');

2022年3月31日を指定し、Carbonのインスタンスを作成しています。

$month->subMonth();

1ヶ月減算する処理です。

return view('month')->with('month', $month);

変数$monthを渡した上で、ビューファイルmonth.blade.phpを表示させます。

★注意点(メインテーマ)

上記の実装を行い、http://localhost/monthにアクセスすると、以下のように日時がブラウザに表示されるはずです。
qiita1.png
「2022年3月31日」から1ヶ月減算すると、感覚的には「2022-02-28(うるう年以外)」のように月末になってほしいところですが、中途半端な日付になってしまいます。

これは「2022年2月31日」という日付が存在しないため、28日からあふれた3日分が加算されたことによるものです。
それでは、ぴったり月末にするにはどうすれば良いのでしょうか?

(答え)
MonthController.phpの該当部分を以下の通りに編集すると解決します。

- $month->subMonth();
+ $month->subMonthNoOverflow();

この編集後、再度http://localhost/monthにアクセスすると、以下のように日時が変わっているはずです。
qiita2.png
これできれいに月末に揃えることができました!
この方がしっくりきますよね!

ちなみに加算するパターンを試すため、先程編集したMonthController.phpを以下のように再編集すると、日時は「2022-04-30 00:00:00」になります。

- $month->subMonthNoOverflow();
+ $month->addMonthNoOverflow();

qiita4.png
なお、ただの$month->addMonth();にした場合は「2022年4月31日」が存在しないので、30日からあふれた1日分が加算されて「2022-05-01 00:00:00」になります。

まとめ

日付や時刻を扱う処理では想定外の結果が生じる可能性が高いので、開発においては注意したいポイントです。
本記事が少しでも読者の皆様の参考になれば幸いです。

それでは良き開発ライフを!!

参考情報

  • Carbon公式

31
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?