どんなときつかうか
予約システムつくるとき、よく使う。例えば予約したい時間帯に**「空きがあるがどうか」**を調べたいときなど。
重複している時間帯をチェックするプログラム
index.php
// 予約したい時間帯
$reserveStartDate = '2021-10-21 14:00';
$reserveEndDate = '2021-10-21 15:00';
// 予約ができないorうまっている時間帯
$fullSinceDate = '2021-10-21 14:30';
$fullUntillDate = '2021-10-21 15:30';
// invertは間隔が負の数になっている場合は1、正の数なら0を返す
$is_duplication = isTimeDuplication($reserveStartDate,$reserveEndDate,$fullSinceDate,$fullUntillDate);
if($is_duplication){
print_r('重複しています。空きがありません');
}
else {
print_r('重複なし。予約可能です。');
}
/*
* @param int $startTimeTarget 比較対象元の時間範囲開始時間
* @param int $endTimeTarget 比較対象元の時間範囲終了時間
* @param int $startTimeSource 比較対象の時間範囲開始時間
* @param int $endTimeSource 比較対象の時間範囲開始時間
* @return bool 重複している場合はtrueを返す
*/
public function isTimeDuplication($startTimeTarget, $endTimeTarget,
$startTimeSource, $endTimeSource)
{
$startTimeTarget = new DateTime($startTimeTarget);
$endTimeTarget = new DateTime($endTimeTarget);
$startTimeSource = new DateTime($startTimeSource);
$endTimeSource = new DateTime($endTimeSource);
$interval_1 = $endTimeSource->diff($startTimeTarget);
$interval_2 = $endTimeTarget->diff($startTimeSource);
return ($interval_1->invert > 0 && $interval_2->invert > 0);
}Ï
New Datetime()の注意点
日時比較
大小比較だけ行いたい場合は
$deadline_date = "2021-11-20";
$objToday = new DateTime();
$objDeadlineDate = new DateTime($deadline_date);
if ($objDeadlineDate <= $objToday) {
print_r('締切オーバー');
}else {
print_r('まだ締め切ってません');
}
でも可能だが、差分も取得したい場合はdiffを使う
$diff = $objToday->diff($objDeadlineDate);
// 締切前の場合
if (!$diff->invert) {
print_r('締切日まで'.$diff->d.'日です');
}
format()はDateTime Objectの中のdateそのものを変形しない
- format()は指定されたフォーマットに整形したDateTime Object内のdateを値を返す。
$objToday = new DateTime();
print_r($objToday->format('Y-m-d'));
print_r($objToday);
出力結果.php
// 出力結果
2021-10-20
DateTime Object
(
[date] => 2021-10-20 14:09:49.185645
[timezone_type] => 3
[timezone] => Asia/Tokyo
)
modify()はDateTime Objectの中のdateそのものを変更する
$objToday = new DateTime();
$arrWeek = array('日', '月', '火', '水', '木', '金', '土');
for ($i = 0; $i < 3; $i++) {
$arrThreeDays[$i]['date'] = $objToday->format('Y-m-d');
$arrThreeDays[$i]['week'] = $arrWeek[$objToday->format('w')];
$objToday->modify('+1 day');
print_r($objToday);
}
print_r($arrThreeDays);
出力結果.php
// 出力結果($objToday)
DateTime Object
(
[date] => 2021-10-21 14:31:31.710356
[timezone_type] => 3
[timezone] => Asia/Tokyo
)
DateTime Object
(
[date] => 2021-10-22 14:31:31.710356
[timezone_type] => 3
[timezone] => Asia/Tokyo
)
DateTime Object
(
[date] => 2021-10-23 14:31:31.710356
[timezone_type] => 3
[timezone] => Asia/Tokyo
)
// 出力結果($arrThreeDays)
Array
(
[0] => Array
(
[date] => 2021-10-20
[week] => 水
)
[1] => Array
(
[date] => 2021-10-21
[week] => 木
)
[2] => Array
(
[date] => 2021-10-22
[week] => 金
)
)