2012-05-08 8 views
6

Tengo el tiempo guardado en la base de datos como las 7:30 pm como un campo varchar. Quiero comprobar si este momento es mayor que el tiempo en este momento o no.PHP: ¿Cómo comparar una cadena de tiempo con fecha ('H: i')?

que convierte la cadena de tiempo DB en '19: 30' y ahora quiere hacer algo como esto:

$my_time = '19:30'; 

if($my_time > date('H:i')) 
{ 
    do something ... 
} 

El problema es el de arriba, devolverá siempre cierto si $ my_time no está vacío cuerdas .

haciendo strtotime($my_time) tampoco está ayudando.

strtotime('H:i',$my_time) lo hace 00:00.

haciendo (int)date('H:i') dará 1700 cuando el tiempo actual es 17:09, lo que la eliminación de colon y luego comparar no funcionará también ....

Cambio de datos de tiempo de la base de datos está fuera de cuestión en este contexto.

por favor ayuda. Corrígeme si declaro algunos hechos incorrectos.

+0

Debe utilizar los campos de fecha y hora nativos en lugar de varchar. Habría resuelto este problema para ti. –

+0

http://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 –

+0

Sé que John ... ese es el mayor problema. –

Respuesta

7

Puede utilizar esta:

$myTime = '19:30'; 
if (date('H:i') == date('H:i', strtotime($myTime))) { 
    // do something 
} 
+0

ya funciona ... gracias –

+0

m usando este .. –

+4

Ha pasado mucho tiempo, pero ¿no es lo mismo que comparar directamente dos cadenas? Dado que 'date()' devuelve una cadena, es exactamente como hacer: 'if (date ('H: i') == '19: 30 ')' ¿no es así ?, que es lo mismo que el OP mencionado molesto. Eso es porque 'date ('H: i', strtotime ($ myTime))' devuelve el valor $ myTime original como string !!! Entonces es lo mismo que poner '$ myTime' en lugar de' date ('H: i', strtotime ($ myTime)) '.so ¿cuál es el punto? Realmente no lo entiendo. ¿Qué me estoy perdiendo? ¿Por qué el 'if ($ mi_hora> fecha ('H: i'))' OP sugiere que supuestamente no funciona? porque SI FUNCIONA para mi – DiegoDD

2

No puede usar los operadores de comparación con cadenas como esa, porque cuando hace las cadenas get converted to numbers first.

Para una solución de una sola línea, puede utilizar strcmp:

if(strcmp($my_time, date('H:i')) == 1) 
{ 
    do something ... 
} 

La condición anterior es semánticamente equivalente a "si $ my_time es mayor que la hora actual", pero sólo si el formato de la cadenas sigue siendo constante!Es muy fácil introducir un error en este código si por alguna razón el formato de $my_time no se corresponde directamente con el patrón H:i.

Asombrar los valores de las cadenas generalmente no es la forma en que debería estar utilizando las fechas y horas. Una solución más apropiada sería usar la clase nativa DateTime, introducida en PHP 5.2.0 (John Conde ya dio un ejemplo en his answer).

Sin embargo, también hay una posible ventaja para tratar los tiempos como valores escalares tontos: los resultados son consistentes con la percepción humana de que 01:00 es siempre más tarde que 00:00. Los enfoques DateTime dependen de la zona horaria local y la fecha, y es posible que no siempre proporcionen los resultados esperados. Ejemplo:

// assume we are in London 
date_default_timezone_set('Europe/London'); 

// assume that today is March 25, 2012 
$date1 = new DateTime("2012-03-25 01:00:00"); 
$date2 = new DateTime("2012-03-25 02:00:00"); 

// and... 
if ($date1 == $date2) { 
    echo "WTF?!? Equal???"; 
} 

See it in action.

El resultado de esta prueba es diferente a la comparación de algunas representaciones escalares de "01:00" y "02:00", por lo que es una buena idea pensar cuál es la semántica adecuada para la comparación.

+0

Está trabajando ... con la zona horaria India, Kolkata. Creo que puedo usarlo en el servidor en vivo. –

1
$date1 = DateTime::createFromFormat('H:i', $my_time1); 
$date2 = new DateTime(); 
if ($date1 > $date2) 
{ 
    // do something 
} 
+0

+1, y el descargo de responsabilidad obligatorio: los resultados de esta prueba pueden ser sorprendentes para valores específicos según la fecha y la zona horaria actuales. – Jon

+0

Recibo el siguiente error: Error fatal: excepción no detectada 'Excepción' con el mensaje 'DateTime :: __ construct() [datetime.--construct]: Error al analizar la cadena de tiempo (H: i) en la posición 1 (:): carácter inesperado' en C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php on line ................... y también seguido de la advertencia: Excepción: DateTime :: __ construct() [datetime.--construct]: Error al analizar la cadena de tiempo (H: i) en la posición 1 (:): carácter inesperado en C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php en la línea –

4

Usted puede construir una nueva DateTime objeto, estableciendo el tiempo en una fecha aleatoria. Que comparar esos dos objetos.por ejemplo:

$my_time = new DateTime('January 1th 1970 19:30'); 
$comparable_time = new DateTime('January 1th 1970 '. date('H:i')); 
if($my_time < $comparable_time) { 
    // do something 
} else { 
    // do something else 
} 

Tenga en cuenta el registro de cambios;

Version 5.2.2 DateTime object comparison with the comparison operators changed to work as expected. Previously, all DateTime objects were considered equal (using ==). 
Cuestiones relacionadas