2012-05-08 12 views
6

Ho tempo risparmiato nel database come 7:30 pm come campo varchar. Voglio verificare se questa volta è maggiore del tempo o no.PHP: come confrontare una stringa temporale con la data ('H: i')?

ho convertito la stringa tempo DB nel '19: 30' e ora voglio fare qualcosa di simile:

$my_time = '19:30'; 

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

Il problema è il sopra restituirà sempre vero se $ my_time non è vuota stringa .

facendo strtotime($my_time) non aiuta neanche.

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

facendo (int)date('H:i') darà 1700 quando il tempo effettivo è 17:09, quindi la rimozione del colon e quindi il confronto non funziona troppo ....

Modifica dei dati in tempo database è fuori discussione in questo contesto.

aiuto plz. Correggimi se ho dichiarato alcuni fatti errati.

+0

Si dovrebbero utilizzare i campi datetime nativi invece di varchar. Avrebbe risolto questo problema per te. –

+0

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

+0

so John ... questo è il problema più grande. –

risposta

7

È possibile utilizzare questo:

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

ya funziona ... grazie –

+0

m usando questo .. –

+4

È passato molto tempo, ma non è lo stesso che confrontare direttamente due stringhe? Poiché 'date()' restituisce una stringa, è esattamente come se fosse: 'if (date (' H: i ') == '19: 30') 'non è vero ?, che è la stessa cosa che l'OP menziona provando. Questo perché 'date ('H: i', strtotime ($ myTime))' restituisce il valore $ myTime originale come stringa !!! Quindi è lo stesso di mettere semplicemente '$ myTime' invece di' date ('H: i', strtotime ($ myTime)). .so qual è il punto? Io davvero non capisco. Cosa mi manca? Perché la data 'if ($ my_time> ('H: i'))' che l'OP suggerisce presumibilmente non funziona? perché funziona per me La domanda – DiegoDD

2

Non è possibile utilizzare gli operatori di confronto con stringhe del genere, poiché quando si eseguono le stringhe get converted to numbers first.

Per una soluzione one-liner, è possibile utilizzare strcmp:

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

La condizione di cui sopra è semanticamente equivalente a "se $ my_time è maggiore del tempo attuale", ma solo se il formato del le stringhe rimangono coerenti!È molto facile introdurre un bug in questo codice se per qualsiasi motivo il formato di $my_time non corrisponde direttamente al modello H:i.

La riduzione dei valori delle stringhe di solito non è il modo in cui si dovrebbe andare usando le date e gli orari. Una soluzione più appropriata sarebbe quella di utilizzare la classe nativa DateTime, introdotta in PHP 5.2.0 (John Conde ha già dato un esempio in his answer).

Tuttavia, c'è anche un possibile vantaggio nel trattare i tempi come valori scalari stupidi: i risultati sono coerenti con la percezione umana secondo cui l'01:00 è sempre dopo le 00:00. Gli approcci DateTime dipendono dal fuso orario locale e dalla data e potrebbero non fornire sempre i risultati previsti. Esempio:

// 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.

Il risultato di questo test è diverso da quello che confronta alcune rappresentazioni scalari di "01:00" e "02:00", quindi è una buona idea pensare a quale sia la semantica corretta per il confronto.

+0

Funziona ... con il fuso orario India, Calcutta. Credo di poterlo usare sul server live. –

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

+1 e la dichiarazione di non responsabilità obbligatoria: i risultati di questo test potrebbero sorprendere per valori specifici in base alla data e al fuso orario correnti. – Jon

+0

Viene visualizzato il seguente errore: Errore irreversibile: eccezione non rilevata 'eccezione' con messaggio 'DateTime :: __ construct() [datetime.--construct]: impossibile analizzare la stringa di tempo (H: i) nella posizione 1 (:): carattere imprevisto' in C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php on line ................... e anche seguito dall'avviso: Exception: DateTime :: __ construct() [datetime.--construct]: Impossibile analizzare la stringa del tempo (H: i) nella posizione 1 (:): carattere imprevisto in C: \ wamp \ www \ workspace \ bigbite \ index_parallel.php sulla riga –

4

è possibile costruire un nuovo DateTime oggetto, l'impostazione del tempo su una data casuale. Che confrontare questi due oggetti.es .:

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

Si prega di prendere nota del registro delle modifiche;

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