特定期間の年月日が配列で取得できる「CarbonPeriod」が便利過ぎた

4 min read読了の目安(約3700字

皆さん、「2019年1月から2020年4月まで」のような特定の期間をセレクトボックスで表示して、例えばその月の売上を表示するみたいな機能を作ることってありません?

そのときに結構苦労するのが、年月日のセレクトボックスを作ること。気づいたら13月が出来ていたり、、、結構頭を使う印象があるのですが、特定期間の日付を表示する際にめちゃくちゃ便利な機能を見つけたので紹介します。

CarbonPeriodはCarbon1.29以降を入れていれば使える

最近Laravelのプロジェクトを作成した人なら全く問題なく使えるかと思います。

まずはCarbonのバージョンが1.29以降かどうか確認してみてください。

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

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

use Carbon\CarbonPeriod;

そして、 CarbonPeriod::create('2019-01-01', '2020-04-01')->toArray(); とすると特定の期間が配列で1日単位で取得できます。

$period = CarbonPeriod::create('2019-01-01', '2020-04-01')->toArray();
=>[
     Carbon\Carbon @1546300800 {#4741
       date: 2019-01-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1546387200 {#4739
       date: 2019-01-02 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1546473600 {#4737
       date: 2019-01-03 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1546560000 {#4735
       date: 2019-01-04 00:00:00.0 UTC (+00:00),
     },
     .
     .
     .
     
   ]

月単位がいい場合はmonthsです。(週単位はweeks, 年単位はyearsがあります)

$period = CarbonPeriod::create('2019-01-01', '2020-04-01')->months()->toArray();
=> [                     
     Carbon\Carbon @1546300800 {#4457                                     
       date: 2019-01-01 00:00:00.0 UTC (+00:00),                        
     },                                                                  
     Carbon\Carbon @1548979200 {#4453
       date: 2019-02-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1551398400 {#4449
       date: 2019-03-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1554076800 {#4445
       date: 2019-04-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1556668800 {#4437
       date: 2019-05-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1559347200 {#4459
       date: 2019-06-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1561939200 {#4467
       date: 2019-07-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1564617600 {#4443
       date: 2019-08-01 00:00:00.0 UTC (+00:00),
     Carbon\Carbon @1567296000 {#4439
       date: 2019-09-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1569888000 {#4441
       date: 2019-10-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1572566400 {#4469
       date: 2019-11-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1575158400 {#4471
       date: 2019-12-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1577836800 {#4473
       date: 2020-01-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1580515200 {#4475
       date: 2020-02-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1583020800 {#4477
       date: 2020-03-01 00:00:00.0 UTC (+00:00),
     },
     Carbon\Carbon @1585699200 {#4479
       date: 2020-04-01 00:00:00.0 UTC (+00:00),
     },
   ]

これはループで回すことで好きなフォーマットにすることができます。

foreach ($period as $key => $date) {
    $dates[] = $date->format('Y-m-d');
}

その他にこういう使い方があります

基本的には公式ドキュメントを参照してほしいのですが、いくつか紹介します。

○日おきに取得する

daysを使用することで実現します。

$period = CarbonPeriod::since('2018-04-21')->days(3)->until('2018-04-27');

最初と最後が取得できます

>>> $period = CarbonPeriod::create('2019-01-01', '2020-04-01')

>>> $period->first();
=> Carbon\Carbon @1546300800 {#4533
     date: 2019-01-01 00:00:00.0 UTC (+00:00),
   }
>>> $period->last();
=> Carbon\Carbon @1585699200 {#4544
     date: 2020-04-01 00:00:00.0 UTC (+00:00),
   }
>>> 

条件を指定できます

$period = CarbonPeriod::create('2019-01-01', '2020-04-01')
$period->addFilter(function ($date) {
    return $date->isWeekend();
});

これで週末の日付だけ取得できます。

終わりに

foreachをせずともいい感じにフォーマットできるようになんないかな〜〜と思いつつ、
開始機関と終了期間を指定して、その間の日付を全取得できるのは超絶便利機能だな!と思いました!

これはぜひ使ってみてください!