Tijd verschil berekenen
Ik ben voor een website aan het berekenen of een restaurant open is. De restaurants zijn vaak tot na middernacht open, zoals 01:00, nu moet ik dus gaan kijken of de huidige tijd voor de tijd is van de sluitingstijd, enkel ondervind ik wat problemen mee. Tot 23:59 gaat het prima, maar daarna niet. Dit is mijn code op dit moment, het werkt tot 23:59, maar daarna geeft hij aan gesloten, terwijl hij nog tot 01:20 open is. In explode[1] en explode[2] zit de open tijd en gesloten tijd en daar maak ik time van.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$time = time();
$open_time = strtotime($explode[1]);
$close_time = strtotime($explode[2]);
$diff_open = ($time - $open_time);
$diff_gesloten = ($time - $close_time);
if ($diff_open > 0 && $diff_gesloten > 0) {
echo "<div class='companypage__restaurantopen'>Open</div>";
}else {
echo "<div class='companypage__restaurantclosed'>Gesloten</div>";
}
$open_time = strtotime($explode[1]);
$close_time = strtotime($explode[2]);
$diff_open = ($time - $open_time);
$diff_gesloten = ($time - $close_time);
if ($diff_open > 0 && $diff_gesloten > 0) {
echo "<div class='companypage__restaurantopen'>Open</div>";
}else {
echo "<div class='companypage__restaurantclosed'>Gesloten</div>";
}
Gewijzigd op 24/11/2016 11:08:27 door Jeremy Evers
Wat zit er exact in $explode[1] en $explode[2]?
Hier zitten 2 tijden in, bijvoorbeeld: 10:00 en 16:00, deze zet ik met strtotime om naar time
Bv: 24-11-2016 14:16
Dan is het veel simpeler uit te rekenen.
Gewijzigd op 24/11/2016 14:17:12 door - SanThe -
Ik kan dan dus niet zien wanneer ik er een volgende dag datum aan moet hangen of niet.
True, daar heb je gelijk in. Maar, hoe kan ik er dan een datum aan geven, aangezien het wekelijks is?
Zo ja, tel bij de eindtijd 24 uur op.
Precies wat ik in mijn voorbeeld ook schets, verrassend genoeg :-)
Goede oplossing, dankjewel had ik zelf nog niet aan gedacht! op deze manier hoef ik er geen datum aan te koppelen, maar werkt het wel! Super, ga het gelijk toepassen.
Toevoeging op 24/11/2016 14:37:58:
Je moet dan wel even dit
if ($diff_open > 0 && $diff_gesloten > 0) {
veranderen in dit
if ($diff_open > 0 && $diff_gesloten < 0) {
if ($dagNamen[date('D')] == $dagen[$explode[0]]) {
Maar dat heb ik erboven staan omdat hij natuurlijk moet checken welke dag het is voor de tijd..
Zit dat array wel logisch in elkaar?
Code (php)
1
2
3
2
3
$dagNamen = array('Mon' => 'Maandag', 'Tue' => 'Dinsdag', 'Wed' => 'Woensdag', 'Thu' => 'Donderdag', 'Fri' => 'Vrijdag', 'Sat' => 'Zaterdag', 'Sun' => 'Zondag');
$dagen = array('Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag');
$dagen = array('Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag');
En dit is de array die ik krijg vanuit de database (aangeleverd van de leverancier waardoor ik daar aan vast zit)
Code (php)
1
0,16:00,00:50;1,16:00,21:20;2,16:00,21:20;4,16:00,00:00;5,16:00,01:20;6,16:00,01:50;3,16:00,00:00
En bovenstaande array explode ik dan als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$explode = explode(';', $delivery_times);
foreach ($explode as $status) {
$explode = explode(',', $status);
if ($dagNamen[date('D')] == $dagen[$explode[0]]) {
$time = time()."<br/>";
$open_time = strtotime($explode[1])."<br/>";
$close_time = strtotime($explode[2])."<br/>";
if ($close_time < $open_time) {
$close_time += 86400;
}
$diff_open = ($time - $open_time);
$diff_gesloten = ($time - $close_time);
if ($diff_open > 0 && $diff_gesloten < 0) {
echo "<div class='companypage__restaurantopen'>Open</div>";
} else {
echo "<div class='companypage__restaurantclosed'>Gesloten</div>";
}
}
}
foreach ($explode as $status) {
$explode = explode(',', $status);
if ($dagNamen[date('D')] == $dagen[$explode[0]]) {
$time = time()."<br/>";
$open_time = strtotime($explode[1])."<br/>";
$close_time = strtotime($explode[2])."<br/>";
if ($close_time < $open_time) {
$close_time += 86400;
}
$diff_open = ($time - $open_time);
$diff_gesloten = ($time - $close_time);
if ($diff_open > 0 && $diff_gesloten < 0) {
echo "<div class='companypage__restaurantopen'>Open</div>";
} else {
echo "<div class='companypage__restaurantclosed'>Gesloten</div>";
}
}
}
Dit vraagt om problemen.
Je doorloopt $explode en het eerste wat je doet is $explode compleet wijzigen.
Maar ik doe dat explode in de foreach omdat ik dan elke keer één dag heb, die heb ik namelijk erboven al ge-explode.
Maar gebruik dan altijd een andere naam.
Wat kan daarnaast het probleem zijn van de tijd? Want daar zit ik nog wel mee, en ben ten einde raad.
Klopt inderdaad, dat is het probleem. Ik haal daar de dag op en de tijd van die dag. Maar soms zijn ze geopend tot 01:00 en dan zegt hij dus om 00:00 dat het een nieuwe dag is en pakt hij de volgende tijd weer van die dag, terwijl hij tot 01:00 de tijd van de vorige dag moet pakken, maar hoe
Daarmee kan je dus nooit de tijd van nu vergelijken.
Zo wel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
function TimeToSec($time)
{
$parts = explode(':', $time);
return $parts[0] * 3600 + $parts[2] * 60 + (count($parts) == 3 ? $parts[2] : 0);
}
$midnight = strtotime(date('Y-m-d 00:00:00'));
$open_time = $midnight + TimeToSec($times[1]);
$closed_time = $midnight + TimeToSec($times[2]);
if ($open_time >= $closed_time)
{
$closed_time += 86400;
}
$now = time();
if ($open_time <= $now && $closed_time >= $now)
{
echo 'Open';
}
else
{
echo 'Gesloten';
}
?>
function TimeToSec($time)
{
$parts = explode(':', $time);
return $parts[0] * 3600 + $parts[2] * 60 + (count($parts) == 3 ? $parts[2] : 0);
}
$midnight = strtotime(date('Y-m-d 00:00:00'));
$open_time = $midnight + TimeToSec($times[1]);
$closed_time = $midnight + TimeToSec($times[2]);
if ($open_time >= $closed_time)
{
$closed_time += 86400;
}
$now = time();
if ($open_time <= $now && $closed_time >= $now)
{
echo 'Open';
}
else
{
echo 'Gesloten';
}
?>
Maar beter kan je de manier waarop je de tijden in de db opslaat aanpassen door hiervoor een aparte tabel aan te maken:
- restaurant_id
- day_id (0[maandag] - 6 [zondag])
- time_open (TIME)
- time_closed (TIME)
Dan met de volgende SQL
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
r.restaurant_id,
r.restaurant_name,
CASE WHEN NOW() BETWEEN o.time_open HOUR_SECOND
AND o.time_closed + INTERVAL IF(o.time_closed <= o.time_open, 24, 0) HOUR
THEN 1 ELSE 0 END is_open
FROM
restaurants r
JOIN
(SELECT
restaurant_id,
CURRENT_DATE + INTERVAL time_open HOUR_SECOND time_open
CURRENT_DATE + INTERVAL time_closed HOUR_SECOND time_closed
FROM
opening_times
WHERE
day_id = WEEKDAY(CURRENT_DATE)
) o USING (restaurant_id)
ORDER BY is_open DESC
r.restaurant_id,
r.restaurant_name,
CASE WHEN NOW() BETWEEN o.time_open HOUR_SECOND
AND o.time_closed + INTERVAL IF(o.time_closed <= o.time_open, 24, 0) HOUR
THEN 1 ELSE 0 END is_open
FROM
restaurants r
JOIN
(SELECT
restaurant_id,
CURRENT_DATE + INTERVAL time_open HOUR_SECOND time_open
CURRENT_DATE + INTERVAL time_closed HOUR_SECOND time_closed
FROM
opening_times
WHERE
day_id = WEEKDAY(CURRENT_DATE)
) o USING (restaurant_id)
ORDER BY is_open DESC
Gewijzigd op 25/11/2016 20:22:47 door Ger van Steenderen