LoginSignup
0
0

More than 1 year has passed since last update.

【PHP】時間帯が重複しているかをチェックする

Last updated at Posted at 2021-11-15

どんなときつかうか

予約システムつくるとき、よく使う。例えば予約したい時間帯に「空きがあるがどうか」を調べたいときなど。

重複している時間帯をチェックするプログラム

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] => 
        )
)
0
0
2

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