Laravel

Laravel CarbonPeriodで特定の期間の年月日を配列で取得する方法

タクマ

こんにちは!タクマです。

31歳未経験からエンジニア転職に成功し、

2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、

PHP/Laravel、Vue.jsを使用し開発をしています。

先日、実務にて月をセレクトボックスで切り替え、選択した月の売り上げを表示するという実装をしたのですが、セレクトボックスに表示する年月日の配列をCarbonPeriodを使い簡単に作成することができました。

ということで今回はLaravelのCarbonPeriodで特定期間の年月日を配列で取得する方法について解説します。

CarbonPeriodの使い方

まずCarbonPeriodを使用するクラスの上でインポートします。

use Carbon\CarbonPeriod;

日単位で取得する場合

日単位で特定の期間の配列を取得する場合は下記のように記述します。

$period = CarbonPeriod::create('2021-08-01', '2021-08-31')->toArray();

dd($period);

// 実行結果
array:31 [▼
  0 => Carbon\Carbon @1627776000 {#275 ▼
    date: 2021-08-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1627862400 {#276 ▼
    date: 2021-08-02 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1627948800 {#277 ▼
    date: 2021-08-03 00:00:00.0 UTC (+00:00)
  }
  .
  .
  .
  30 => Carbon\Carbon @1630368000 {#305 ▼
    date: 2021-08-31 00:00:00.0 UTC (+00:00)
  }
]

また下記のように書くことで特定の日付から現在までの期間の配列を取得することもできます。

(この記事を書いているのが2021年9月4日なので、9月4日まで取得できています)

$period = CarbonPeriod::start('2021-08-01')->untilNow()->toArray();
        
dd($period);

// 実行結果
array:31 [▼
  0 => Carbon\Carbon @1627776000 {#275 ▼
    date: 2021-08-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1627862400 {#276 ▼
    date: 2021-08-02 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1627948800 {#277 ▼
    date: 2021-08-03 00:00:00.0 UTC (+00:00)
  }
  .
  .
  .
  34 => Carbon\Carbon @1630713600 {#309 ▼
    date: 2021-09-04 00:00:00.0 UTC (+00:00)
  }
]

untilNow()の便利なところは自動的に期間を現在まで増やしてくれるところです。

たとえば、これが2022年1月1日になった場合、上記配列も2021-08-012022-01-01までの期間を自動的に取得できるようになります。

つまり特定の日付から現在までの期間の配列を作成する場合、カスタマイズが要らないということになります。

月単位で取得する場合

下記のようにmonths()を追加することで月単位で取得することもできます。

特定の期間の配列を取得する場合

// 第一引数の日付を基準として第二引数の日付まで一ヶ月毎の年月日を取得する
$period = CarbonPeriod::create('2021-01-01', '2021-09-01')->months()->toArray();
        
dd($period);

// 実行結果
array:9 [▼
  0 => Carbon\Carbon @1609459200 {#275 ▼
    date: 2021-01-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1612137600 {#276 ▼
    date: 2021-02-01 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1614556800 {#277 ▶}
  3 => Carbon\Carbon @1617235200 {#278 ▶}
  4 => Carbon\Carbon @1619827200 {#279 ▶}
  5 => Carbon\Carbon @1622505600 {#280 ▶}
  6 => Carbon\Carbon @1625097600 {#281 ▶}
  7 => Carbon\Carbon @1627776000 {#282 ▶}
  8 => Carbon\Carbon @1630454400 {#283 ▼
    date: 2021-09-01 00:00:00.0 UTC (+00:00)
  }
]

特定の日付から現在までの期間を取得する場合

(この記事を書いているのが2021年9月4日なので、9月1日まで取得できています)

$period = CarbonPeriod::start('2020-01-01')->untilNow()->months()->toArray();

dd($period);

// 実行結果
array:9 [▼
  0 => Carbon\Carbon @1609459200 {#272 ▼
    date: 2021-01-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1612137600 {#274 ▼
    date: 2021-02-01 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1614556800 {#278 ▶}
  3 => Carbon\Carbon @1617235200 {#276 ▶}
  4 => Carbon\Carbon @1619827200 {#279 ▶}
  5 => Carbon\Carbon @1622505600 {#280 ▶}
  6 => Carbon\Carbon @1625097600 {#281 ▶}
  7 => Carbon\Carbon @1627776000 {#282 ▶}
  8 => Carbon\Carbon @1630454400 {#283 ▼
    date: 2021-09-01 00:00:00.0 UTC (+00:00)
  }
]

年単位で取得する場合

下記のようにyears()を追加することで月単位で取得することもできます。

特定の期間の配列を取得する場合

// 第一引数の日付を基準として第二引数の日付まで一年毎の年月日を取得する
$period = CarbonPeriod::create('2013-01-01', '2021-09-01')->years()->toArray();
        
dd($period);

//実行結果
array:9 [▼
  0 => Carbon\Carbon @1356998400 {#275 ▼
    date: 2013-01-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1388534400 {#276 ▼
    date: 2014-01-01 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1420070400 {#277 ▶}
  3 => Carbon\Carbon @1451606400 {#278 ▶}
  4 => Carbon\Carbon @1483228800 {#279 ▶}
  5 => Carbon\Carbon @1514764800 {#280 ▶}
  6 => Carbon\Carbon @1546300800 {#281 ▶}
  7 => Carbon\Carbon @1577836800 {#282 ▶}
  8 => Carbon\Carbon @1609459200 {#283 ▼
    date: 2021-01-01 00:00:00.0 UTC (+00:00)
  }
]

特定の日付から現在までの期間を取得する場合

(この記事を書いているのが2021年9月4日なので、2021年1月1日まで取得できています)

$period = CarbonPeriod::start('2013-01-01')->untilNow()->years()->toArray();
        
dd($period);

// 実行結果
array:9 [▼
  0 => Carbon\Carbon @1356998400 {#275 ▼
    date: 2013-01-01 00:00:00.0 UTC (+00:00)
  }
  1 => Carbon\Carbon @1388534400 {#276 ▼
    date: 2014-01-01 00:00:00.0 UTC (+00:00)
  }
  2 => Carbon\Carbon @1420070400 {#277 ▶}
  3 => Carbon\Carbon @1451606400 {#278 ▶}
  4 => Carbon\Carbon @1483228800 {#279 ▶}
  5 => Carbon\Carbon @1514764800 {#280 ▶}
  6 => Carbon\Carbon @1546300800 {#281 ▶}
  7 => Carbon\Carbon @1577836800 {#282 ▶}
  8 => Carbon\Carbon @1609459200 {#283 ▼
    date: 2021-01-01 00:00:00.0 UTC (+00:00)
  }
]

フォーマットを変更する場合

下記のようにすることでフォーマットを変更することもできます。

$period = CarbonPeriod::create('2013-01-01', '2021-09-01')->years()->toArray();
        
$dates = [];
foreach ($period as $date) {
    $dates[] = $date->format('Y/m/d');
}

 dd($dates);
// 実行結果
array:9 [▼
  0 => "2013/01/01"
  1 => "2014/01/01"
  2 => "2015/01/01"
  3 => "2016/01/01"
  4 => "2017/01/01"
  5 => "2018/01/01"
  6 => "2019/01/01"
  7 => "2020/01/01"
  8 => "2021/01/01"
]

また下記のようにすればセレクトボックスに表示させる用のフォーマットとvalue用フォーマットに分けることもできます。

$period = CarbonPeriod::create('2021-01-01', '2021-09-01')->months()->toArray();

$dates = [];
foreach ($period as $date) {
    $dates[] = [
        'value' => $date->format('Y-m-d'),
        'display' => $date->format('Y年n月')
    ];
}

dd($dates);

// 実行結果
array:9 [▼
  0 => array:2 [▼
    "value" => "2021-01-01"
    "display" => "2021年1月"
  ]
  1 => array:2 [▼
    "value" => "2021-02-01"
    "display" => "2021年2月"
  ]
  2 => array:2 [▶]
  3 => array:2 [▶]
  4 => array:2 [▶]
  5 => array:2 [▶]
  6 => array:2 [▶]
  7 => array:2 [▶]
  8 => array:2 [▼
    "value" => "2021-09-01"
    "display" => "2021年9月"
  ]
]

最初の日付と最後の日付を取得する場合

下記のように記述することで最初の日付と最後の日付を取得することもできます。

※最初と最後の日付を取得する場合はとtoArray()で配列にすると取得できません。

$period = CarbonPeriod::create('2013-01-01', '2021-09-01')->years();
$period->first();

Carbon\Carbon @1356998400 {#275 ▼
  date: 2013-01-01 00:00:00.0 UTC (+00:00)
}

$period->last();

Carbon\Carbon @1609459200 {#272 ▼
  date: 2021-01-01 00:00:00.0 UTC (+00:00)
}

さいごに

いかがでしたでしょうか?

CarbonPeriodの使い方ついて理解できましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の33歳

新卒で入社した専門商社で8年間営業職として勤務

30歳からプログラミングを始め31歳でWebエンジニアに転職成功

受託開発企業での開発を1年弱経験したのち、現在はスタートアップの自社開発企業で開発に従事している
\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA