Как сравнить два времени в 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 как можно ближе. Что может вызвать это?

11 ответов


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

$resttimefrom = 73000;
$resttimeto = 223000;

$currentTime = (int) date('Gis');

if ($currentTime > $resttimefrom && $currentTime < $resttimeto )
{
    $stat="open";
}
else
{
    $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 = mktime(7,30,0);
$resttimeto = mktime(22,30,0);

$time = mktime(date('H'),date('i'),date('s'));

вы сравниваете строки.
Преобразование строки времени в метки времени с strtotime().
Тогда сравните с time().


$today = date("m-d-y ");
$now = date("m-d-y G:i:s");

if (strtotime($today . $resttimefrom) < $now && $now > strtotime($today . $resttimeto)) {
    $stat = 'open';
else
    $stat = 'close

просто преобразуйте даты в метку времени 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";
} 

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

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

$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
}

$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;

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