概要
みなさん、DateTime関数は使っていますか?
カレンダーに、ToDoの日付計算に、日付表示部分をいい感じに表示するのに……
システム開発において、DateTime関数は避けることのできないクラスでしょう。
そんなDateTimeクラスと関連のある、超便利なクラスの紹介です。
ちょっと待って!それforループするの!?
PHPソースコードでカレンダーの出力をする場合、適当に調べるとこのような処理が出てきたりします。
//タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');
//表示させる年月を設定 ↓これは現在の月
$year = date('Y');
$month = date('m');
//月末日を取得
$end_month = date('t', strtotime($year.$month.'01'));
$aryCalendar = [];
//1日から月末日までループ
for ($i = 1; $i <= $end_month; $i++){
$aryCalendar[$i]['day'] = $i;
$aryCalendar[$i]['week'] = date('w', strtotime($year.$month.sprintf('%02d', $i)));
}
一ヶ月分だけなら単純な処理ですね。
では、表示を2か月区切りに…3か月……いや、一年区切りで……と伸びたとき、どうしますか?
一か月だけだとしてもそもそも業務上の区切り日は15日終わり、16日開始でありそれに合わせる場合はどうしましょうか?
なんと、簡単に解決します!そうDatePeriodならね。
詳しいドキュメントは以下。
https://www.php.net/manual/ja/class.dateperiod.php
例えば一か月だけならこんな感じです。
$now = new \DateTime();
$startDate = \DateTime::createFromFormat("Y-m-d", $now->format("Y-m-") . "1")->setTime(0,0,0);
$endDate = \DateTime::createFromFormat("Y-m-d", $now->format("Y-m-t"))->setTime(23,59,59);
$interval = new \DateInterval('P1D');
$datePeriod = new \DatePeriod($startDate, $interval, $endDate);
$aryCalendar = [];
foreach($datePeriod as $datetime) {
$aryCalendar[$datetime->format("Y-m-d")] = [
"day" => $datetime->format("d"),
"week" => $datetime->format("D")
];
}
とりあえずDateTimeクラスで開始日と終了日さえ決めてしまえば、DatePeriodの時点でDateTimeクラスの配列のように利用することのできるクラスを出力することができます。
これで15日締めでも簡単!
さらに、日付同士の間隔はDateIntervalで決定しているため、一週間毎・一か月毎のような案件でも簡単に作成することができます。
みなさんもDatePeriodを使って簡単な日付管理ライフを!