2010-08-04 23 views
15

Tenía dos veces en el formato como 7:30:00 y 22:30:00 almacenadas en las variables $resttimefrom y $resttimeto respectivamente.Cómo comparar dos veces en PHP

Quiero comprobar si la hora actual se encuentra entre estos dos valores. Estoy comprobando esto con el código

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

Pero siempre obtengo la estadística $ Close. ¿Qué puede causar eso?

+0

Gracias a sus una lógica sencilla! – Rajasekar

+0

posible duplicado de [PHP - Compare Date] (http://stackoverflow.com/questions/2113940/php-compare-date) – Kuf

+0

Es porque $ resttimefrom y $ resttimeto no están definidos – Black

Respuesta

-3

Como Col. metralla Said que estoy haciendo mediante la conversión de todo el tiempo a segundos y luego se compara con el total de segundos de la hora actual

+0

¿Quiere decir que esto es una respuesta aceptada ??? –

3

Está buscando una combinación de cuerdas.
Convierta las cadenas de tiempo en marcas de tiempo con strtotime().
Luego compare con time().

3
$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 
2

La función date devuelve una cadena, por lo que la comparación que estés haciendo sería una comparación de cadenas - 07:30 por lo que habría más de 22:30

Sería mucho mejor usar mktime , que devolverá un valor de marca de tiempo Unix (entero) por lo que tendría para una comparación mejor

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

http://php.net/mktime

+0

Como se menciona en las respuestas anteriores: if el tiempo se le proporciona como una cadena, entonces sería más fácil usar strtotime –

+0

Cuando se llama sin argumentos, 'mktime()' lanza un aviso de 'E_STRICT'. Además, su código podría dar lugar a resultados falsos cuando el horario de verano sea un factor. 'mktime' tiene una bandera para indicar DST, pero a partir de PHP5.3 también arroja un aviso' E_DEPRECATED' si se usa el parámetro 'is_dst'. – Gordon

4

Trata de reformatearlos en algo que puedas comparar de esa manera. Por ejemplo, números:

$resttimefrom = mktime(7,30,0); 
$resttimeto = mktime(22,30,0); 

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

no tiene en cuenta el horario de verano. – Gordon

1

¡Simplemente convierta sus fechas a una marca de tiempo Unix, compárelas, tiene sus resultados! Puede parecer algo como esto:

$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"; 
} 
0
$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; 
20

Una forma sencilla pero elegante de hacer esto es para eliminar el ':' de sus fechas.

$resttimefrom = 73000; 
$resttimeto = 223000; 

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

if ($currentTime > $resttimefrom && $currentTime < $resttimeto) 
{ 
    $stat="open"; 
} 
else 
{ 
    $stat="close"; 
} 
+0

Buena idea. Estoy tratando de hacer esto en Twig sin 'strtotime' y esto funciona muy bien. – regularmike

1

El truco para la manipulación y la comparación de fechas y horas en PHP es almacenar los valores de fecha/hora en una variable de número entero y usar el() funciones mktime(), fecha() y strtotime. La representación entera de una fecha/hora es el número de segundos desde la medianoche de 1970 a enero de 1, que se conoce como la 'época'. Una vez que su fecha/hora esté en forma de número entero, podrá compararla de manera eficiente con otras fechas que también están en forma de número entero.

Por supuesto, ya que lo más probable es que reciba valores de fecha/hora de solicitudes de página y consultas de selección de base de datos, necesitará convertir su cadena de fecha/hora en un entero antes de poder hacer ninguna comparación o aritmética.

Suponiendo que está seguro de que las variables $ resttimefrom y $ resttimeto contienen una hora con formato adecuado, puede usar la función strtotime() para convertir su tiempo de cadena en un entero. strtotime() toma una cadena que está formateada como una fecha y la convierte a la cantidad de segundos desde epoch.

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

Nota al margen: strtotime() siempre devuelve una fecha completa en forma de número entero. Si su cadena no tiene una fecha, solo una hora, strtotime() devuelve la fecha de hoy junto con la hora que dio en la cadena.Sin embargo, esto no es importante para usted, porque las dos fechas devueltas por strtotime() tendrán la misma fecha y la comparación de las dos variables tendrá el efecto deseado de comparar las dos veces, ya que las fechas se anulan mutuamente.

Al comparar los dos enteros, tenga en cuenta que cuanto antes sea la fecha/hora, menor será su valor entero. Así que si quieres ver si $ time_from es anterior a $ time_to, que la presente:

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

Ahora comparar una Fecha/hora con la fecha actual del sistema/hora, sólo tiene que utilizar mktime() sin parámetros para representar la fecha/hora actual:

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

p.s. no use mktime() sin parámetros. Si bien esto todavía funciona, ahora está en desuso. Use time() para obtener el número de segundos desde epoch. – emurano

21

puede probar a usar strtotime

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

a continuación, comprobar

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

espero que esto le puede ayudar ..

+1

+1 para ayudar pero para evitar el error "Aviso: uso de constante indefinida ahora - asumido 'ahora'", encapsular las palabras clave en comillas – MrSo

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