2010-08-04 3 views
15

J'ai eu deux fois dans le format comme 7:30:00 et 22:30:00 stockés dans les variables $resttimefrom et $resttimeto respectivement.Comment comparer deux fois en PHP

Je souhaite vérifier si l'heure actuelle est comprise entre ces deux valeurs. Je vérifie cela avec le code

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

Mais je reçois toujours le $ stat comme proche. Qu'est-ce qui peut causer ça?

+0

Merci Its a une logique simple! – Rajasekar

+0

duplication possible de [PHP - Date de comparaison] (http://stackoverflow.com/questions/2113940/php-compare-date) – Kuf

+0

C'est parce que $ resttimefrom et $ resttimeto ne sont pas définis – Black

Répondre

-3

Comme le colonel Shrapnel a dit que je suis en train de faire en convertissant tout le temps pour quelques secondes, puis le comparer avec les secondes au total de temps en cours

+0

Voulez-vous dire, c'est une réponse acceptée ???? –

3

Vous comparez des chaînes.
Convertissez les chaînes de temps en horodatages avec strtotime().
Comparez ensuite avec 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 fonction date retourne une chaîne, de sorte que la comparaison que vous faites serait une comparaison de chaîne - donc 07h30 serait plus 22:30

Il serait préférable d'utiliser mktime , qui renvoie une valeur d'horodatage Unix (entier) donc il serait une meilleure comparaison

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

http://php.net/mktime

+0

Comme mentionné dans les réponses ci-dessus: si le temps vous est fourni sous la forme d'une chaîne, alors il serait plus facile d'utiliser strtotime –

+0

Lorsqu'il est appelé sans arguments, 'mktime()' lance un avis 'E_STRICT'. En outre, votre code peut potentiellement conduire à des résultats erronés lorsque l'heure d'été est un facteur. 'mktime' a un drapeau pour indiquer DST, mais dès PHP5.3 il lance aussi un avis' E_DEPRECATED' si le paramètre 'is_dst' est utilisé. – Gordon

4

Essayez de les reformater en quelque chose que vous pouvez comparer comme ça. Par exemple, les nombres:

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

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

ne prend pas en compte DST. – Gordon

1

Il suffit de convertir vos dates en un horodatage Unix, comparez-les, vous avez vos résultats! Il pourrait ressembler à ceci:

$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

Une façon simple et intelligente de le faire est d'enlever le « : » de vos dates.

$resttimefrom = 73000; 
$resttimeto = 223000; 

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

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

Bonne idée. J'essaye de le faire dans Twig sans 'strtotime' et ça marche bien. – regularmike

1

L'astuce pour manipuler et comparer les dates et heures en PHP est de stocker des valeurs de date/heure dans une variable entière et d'utiliser la, la date mktime()() et strtotime(). La représentation entière d'une date/heure est le nombre de secondes depuis minuit, 1970-Jan-1, qui est appelé «époque». Une fois que votre date/heure est sous la forme d'un nombre entier, vous serez en mesure de le comparer efficacement à d'autres dates qui sont également sous forme entière. Bien sûr, puisque vous recevrez probablement des valeurs de date/heure à partir des requêtes de page et des requêtes de sélection de base de données, vous devrez convertir votre chaîne de date/heure en entier avant de pouvoir effectuer une comparaison ou une arithmétique. En supposant que vous êtes sûr que les variables $ resttimefrom et $ resttimeto contiennent un temps correctement formaté, vous pouvez utiliser la fonction strtotime() pour convertir votre temps de chaîne en entier. strtotime() prend une chaîne formatée comme une date et la convertit en nombre de secondes depuis l'époque.

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

Note de côté: strtotime() renvoie toujours une date complète sous forme entière. Si votre chaîne n'a pas de date, strtotime() renvoie uniquement la date du jour avec l'heure indiquée dans la chaîne.Ce n'est pas important pour vous, car les deux dates retournées par strtotime() auront la même date et comparer les deux variables aura l'effet désiré de comparer les deux fois car les dates s'annulent mutuellement. Lorsque vous comparez les deux entiers, gardez à l'esprit que plus la date et l'heure sont précoces, plus sa valeur entière sera petite. Donc, si vous voulez voir si time_from $ est plus tôt que time_to $, vous auriez ceci:

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

Maintenant, pour comparer une date/heure avec la date système/heure actuelle, il suffit d'utiliser mktime() sans paramètre pour représenter la date/heure actuelle:

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

p.s. n'utilisez pas mktime() sans paramètres. Bien que cela fonctionne, il est maintenant obsolète. Utilisez time() pour obtenir le nombre de secondes écoulées depuis l'époque. – emurano

21

vous pouvez essayer d'utiliser strtotime

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

puis vérifiez

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

J'espère que cela peut vous aider ..

+1

+ 1 pour aider mais pour éviter l'erreur "Remarque: L'utilisation de la constante indéfinie maintenant - supposé 'maintenant'", encapsule les mots-clés entre guillemets – 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;