LoginSignup
0
0

More than 3 years have passed since last update.

[PHP][DatePeriod]一定の期間の中から特定の曜日を取り出す、とかが超便利になるクラス

Posted at

概要

みなさん、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を使って簡単な日付管理ライフを!

0
0
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
0
0