📌
特定期間の年月日が配列で取得できる「CarbonPeriod」が便利過ぎた
皆さん、「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をせずともいい感じにフォーマットできるようになんないかな〜〜と思いつつ、
開始機関と終了期間を指定して、その間の日付を全取得できるのは超絶便利機能だな!と思いました!
これはぜひ使ってみてください!
Discussion