Как сравнить два раза в PHP

У меня было два раза в формате, например, 7:30:00 и 22:30:00, хранящиеся в переменных $resttimefrom и $resttimeto соответственно.

Я хочу проверить, находится ли текущее время между этими двумя значениями. Я проверяю это с помощью кода

 $time = date("G:i:s"); if ($time > $resttimefrom and $time < $resttimeto ){ $stat = "open"; } else { $stat = "close"; } 

Но я всегда получаю $ stat как Close. Что может быть причиной этого?

вы можете попробовать использовать strtotime

 $st_time = strtotime($resttimefrom); $end_time = strtotime($resttimeto); $cur_time = strtotime(now); 

затем проверьте

 if($st_time < $cur_time && $end_time > $cur_time) { echo "WE ARE CLOSE NOW !!"; } else{ echo "WE ARE OPEN NOW !!"; } 

Надеюсь, это поможет вам.

Простой, но умный способ сделать это – удалить «:» из ваших дат.

 $resttimefrom = 73000; $resttimeto = 223000; $currentTime = (int) date('Gis'); if ($currentTime > $resttimefrom && $currentTime < $resttimeto ) { $stat="open"; } else { $stat="close"; } 

Попробуйте переформатировать их в нечто такое, что вы можете сравнить. Например, цифры:

 $resttimefrom = mktime(7,30,0); $resttimeto = mktime(22,30,0); $time = mktime(date('H'),date('i'),date('s')); 

Вы сравниваете строки.
Преобразуйте временные строки в метки времени с помощью strtotime() .
Затем сравните с time() .

 $today = date("mdy "); $now = date("mdy G:i:s"); if (strtotime($today . $resttimefrom) < $now && $now > strtotime($today . $resttimeto)) { $stat = 'open'; else $stat = 'close 

Функция date возвращает строку, поэтому сравнение, которое вы делаете, будет строковым сравнением – поэтому 7:30 будет больше 22:30

Было бы намного лучше использовать mktime , которое вернет значение временной отметки Unix (integer), чтобы было лучшее сравнение

 $currentTime = mktime(); $resttimefrom = mktime(hour,min,second); 

http://php.net/mktime

Уловкой манипулирования и сравнения дат и времени в PHP является сохранение значений даты и времени в целочисленной переменной и использование функций mktime (), date () и strtotime (). Целочисленное представление даты / времени – это количество секунд с полуночи, 1970-янв-1, которое называется «эпохой». Когда ваша дата / время будет в целочисленной форме, вы сможете эффективно сравнить ее с другими датами, которые также находятся в целочисленной форме.

Конечно, поскольку вы, скорее всего, будете получать значения даты / времени из запросов страниц и запросов выбора базы данных, вам нужно будет преобразовать вашу строку даты / времени в целое число, прежде чем вы сможете выполнить какое-либо сравнение или арифметику.

Предполагая, что вы уверены, что переменные $ resttimefrom и $ resttimeto содержат правильно отформатированное время, вы можете использовать функцию strtotime () для преобразования времени строки в целое число. strtotime () принимает строку, которая отформатирована как дата и преобразует ее в число секунд с эпохи.

 $time_from = strtotime($resttimefrom); $time_to = strtotime($resttimeto); 

Боковое примечание: strtotime () всегда возвращает полную дату в целочисленной форме. Если в вашей строке нет даты, только время, strtotime () возвращает сегодняшнюю дату вместе со временем, которое вы указали в строке. Это не важно для вас, потому что две даты, возвращаемые strtotime (), будут иметь одну и ту же дату, и сравнение двух переменных будет иметь желаемый эффект от сравнения двух раз по мере того, как даты отменяют друг друга.

Когда вы сравниваете два целых числа, имейте в виду, что чем раньше дата / время, тем меньше будет его целочисленное значение. Поэтому, если вы хотите увидеть, превышает ли $ time_from значение $ time_to, у вас будет следующее:

 if ($time_from < $time_to) { // $time_from is ealier than $time_to } 

Теперь, чтобы сравнить дату / время с текущей системной датой / временем, просто используйте mktime () без параметров для представления текущей даты / времени:

 if ($time_from < mktime()) { // $time_from is in the past } 

Просто конвертируйте свои даты в отметку времени Unix, сравните их, у вас есть свои результаты! Это может выглядеть примерно так:

 $time =date("G:i:s"); $time1 = strtotime($time); $resttimefrom1 = strtotime($resttimefrom ); $resttimeto1 = strtotime($resttimeto ); if ($time1 >$resttimefrom and $time1 <$resttimeto) { $stat="open"; } else { $stat="close"; } 
 $firstTime = '1:07'; $secondTime = '3:01'; list($firstMinutes, $firstSeconds) = explode(':', $firstTime); list($secondMinutes, $secondSeconds) = explode(':', $secondTime); $firstSeconds += ($firstMinutes * 60); $secondSeconds += ($secondMinutes * 60); $difference = $secondSeconds - $firstSeconds; 
 $Time1 = date_parse($time); $seconds1 = $Time1['hour'] * 3600 + $Time1['minute'] * 60 + $Time1['second']; $Time2 = date_parse($current_time); $seconds2 = Time2['hour'] * 3600 + Time2['minute'] * 60 + Time2['second']; $actula_time = $seconds1 - $seconds2; echo floor($actula_time / 3600) .":". floor(($actula_time / 60)%60) .":". $actula_time%60; 

Поскольку Col. Shrapnel Said я делаю, преобразовывая все время в секунды, а затем сравнивая его с суммарными секундами текущего времени