日付(午前0時)をまたぐ時間の判定


はじめに

レストランや飲み屋などの場合、営業時間が日付(午前0時)をまたぐケースが多くあります。そのようなケースで営業時間内であるか否かを判定する際の方法は、検索してもヒットが意外と少ない。「基本的なことでは?」といわれてしまえばその通りですが、備忘録としてPHPのコードを残しておこうと思います。

方法

お店の営業時間は、「18:00~3:00」のような形式で設定されますので、開店時間と閉店時間をそれぞれ $openTime と $closeTime とします。これらと現在の時間 $nowTime を比較すればよいのです。

$openTime と $closeTime が日付(午前0時)をまたがなければ、下記のコードになります。

$openTime     = '18:00:00'; // 開店時間
$closeTime    = '23:00:00'; // 閉店時間
$openTimeObj  = new DateTime($openTime);
$closeTimeObj = new DateTime($closeTime);
$nowTimeObj   = new DateTime();
if( $openTimeObj <= $nowTimeObj && $closeTimeObj >= $nowTimeObj )
{
	// 営業時間内
}
else
{
	// 営業時間外
}

日付(午前0時)をまたぐケースを考慮する場合、$openTime < $closeTime 、 $openTime > $closeTime 、 $openTime == $closeTime でわけての組み立てになります。

$openTime     = '18:00:00'; // 開店時間
$closeTime    = '03:00:00'; // 閉店時間
$openTimeObj  = new DateTime($openTime);
$closeTimeObj = new DateTime($closeTime);
$nowTimeObj   = new DateTime();
if( $openTimeObj < $closeTimeObj ) // 午前0時をまたがない営業時間の場合
{
	if( $openTimeObj <= $nowTimeObj && $closeTimeObj >= $nowTimeObj )
	{
		// 営業時間内
	}
	else
	{
		// 営業時間外
	}
}
elseif( $openTimeObj > $closeTimeObj ) // 午前0時をまたぐ営業時間の場合
{
	if( $openTimeObj <= $nowTimeObj || $closeTimeObj >= $nowTimeObj )
	{
		// 営業時間内
	}
	else
	{
		// 営業時間外
	}
}
else // 開店と閉店が同じ時間
{
	// 24時間営業?
}

上記に「休店日」を考慮するともう少し複雑になります。