2010-08-04 24 views
15

Miałem dwa razy w formacie jak 7:30:00 i 22:30:00 przechowywane odpowiednio w zmiennych $resttimefrom i $resttimeto.Jak porównać dwa razy w PHP

Chcę sprawdzić, czy aktualny czas znajduje się pomiędzy tymi dwiema wartościami. Sprawdzam to z kodem

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

Ale zawsze otrzymuję $ stat jako Zamknij. Co może to powodować?

+0

Dzięki jego prosta logika! – Rajasekar

+0

możliwy duplikat [PHP - Porównaj datę] (http://stackoverflow.com/questions/2113940/php-compare-date) – Kuf

+0

To dlatego, że $ resttimefrom i $ resttimeto nie są zdefiniowane – Black

Odpowiedz

-3

Jak Kol Shrapnel Said robie przekształcając cały czas do sekund, a następnie porównać je z całkowitych sekund aktualny czas za

+0

Czy masz na myśli, że jest to zaakceptowana odpowiedź ???? –

3

Porównywasz ciągi.
Konwertuj łańcuchy czasu na znaczniki czasu za pomocą strtotime().
Następnie porównaj z 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

Funkcja date zwraca ciąg znaków, więc porównanie robisz byłoby porównanie String - tak 7:30 będzie więcej niż 22:30

Byłoby znacznie lepiej użyć mktime , która będzie zwracać wartość datownika Unix (całkowitej), więc byłoby to zrobić dla lepszego porównania

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

http://php.net/mktime

+0

Jak wspomniano w powyższych odpowiedziach: czas jest dostarczany do ciebie jako ciąg, wtedy łatwiej byłoby użyć strtotime –

+0

Gdy wywoływany bez argumentów, 'mktime()' rzuca powiadomienie 'E_STRICT'. Ponadto Twój kod może potencjalnie prowadzić do fałszywych wyników, gdy DST jest czynnikiem. 'mktime' ma flagę wskazującą DST, ale od PHP5.3 również zgłasza anons' E_DEPRECATED', jeśli użyto parametru 'is_dst'. – Gordon

4

Spróbuj sformatować je w coś, co możesz porównać w ten sposób. Na przykład numery:

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

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

nie uwzględnia DST. – Gordon

1

Wystarczy przekształcić daty w datownik Unix, porównać je, masz wyniki! Może to wyglądać mniej więcej tak:

$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

prosty, ale elegancki sposób to zrobić, to usunąć „:” od swoich dat.

$resttimefrom = 73000; 
$resttimeto = 223000; 

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

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

Dobry pomysł. Próbuję to zrobić w Twig bez 'strtotime' i to działa ładnie. – regularmike

1

Trick do manipulowania i porównywanie dat i czasu w PHP jest do przechowywania wartości daty/godziny w zmiennej całkowitej i używać (funkcji) mktime() Data() i strtotime. Całkowita liczba dni i godzin jest to liczba sekund od północy, 1970-sty-1, nazywana "epoką". Gdy twoja data/godzina jest w postaci całkowitej, będziesz w stanie efektywnie porównać ją z innymi datami, które również są w postaci całkowitej.

Oczywiście, ponieważ najprawdopodobniej będziesz otrzymywać wartości daty/godziny od żądań stron i zapytań o bazę danych, musisz przekonwertować ciąg daty/czasu na liczbę całkowitą, zanim będziesz mógł dokonać porównania lub arytmetycznej.

Zakładając, że masz pewność, że zmienne $ resttimefrom i $ resttimeto zawierają odpowiednio sformatowany czas, możesz użyć funkcji strtotime(), aby przekształcić swój ciąg w liczbę całkowitą. strtotime() pobiera ciąg znaków sformatowany jako data i konwertuje go na liczbę sekund od epoki.

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

Nota boczna: strtotime() zawsze zwraca pełną datę w postaci liczby całkowitej. Jeśli twój ciąg nie ma daty, tylko czas, strtotime() zwraca dzisiejszą datę wraz z czasem podanym w ciągu.Nie jest to dla ciebie ważne, ponieważ dwie daty zwrócone przez strtotime() będą miały tę samą datę, a porównanie dwóch zmiennych będzie miało pożądany efekt porównania dwóch czasów, gdy daty znoszą się nawzajem.

Porównując dwie liczby całkowite należy pamiętać, że im wcześniej data/godzina, tym mniejsza będzie jej wartość całkowita. Więc jeśli chcesz zobaczyć, czy $ time_from jest wcześniejsza niż $ time_to, to masz to:

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

Teraz porównać datę/czas z bieżąca data systemowa/czas, wystarczy użyć mktime() bez parametrów do reprezentowania aktualną datę/czas:

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

p.s. nie używaj mktime() bez parametrów. Chociaż to nadal działa, jest teraz przestarzałe. Użyj time(), aby uzyskać liczbę sekund od epoki. – emurano

21

można spróbować użyć strtotime

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

następnie sprawdzić

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

Mam nadzieję, że to może pomóc ..

+1

+1 za pomoc, ale uniknięcie błędu "Uwaga: teraz użyj niezdefiniowanej stałej - przyjmij" teraz "", zamknij słowa kluczowe w cudzysłowach – 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;