Tengo este simple script php de horas de tienda.
Agrega el horario de apertura de la tienda en la matriz.
Luego lo repites en la página.
Sin embargo, tengo, por ejemplo, de 10:00 a. m. a 12:00 a. m. y rompe la lógica.
Se supone que dice ESTAMOS ABIERTOS... pero dice CERRADO.
Funciona para cualquier otro momento del día... pero a medianoche algo anda mal.
¿Por favor ayuda? Probablemente algo fácil que no estoy viendo.
<?php date_default_timezone_set('America/New_York'); $storeSchedule = [ 'Monday' => ['10:00 AM' => '11:00 PM'], 'Tuesday' => ['10:00 AM' => '11:00 PM'], 'Wednesday' => ['10:00 AM' => '11:00 PM'], 'Thursday' => ['10:00 AM' => '11:00 PM'], 'Friday' => ['10:00 AM' => '12:00 AM'], 'Saturday' => ['10:00 AM' => '12:00 AM'], 'Sunday' => ['10:00 AM' => '11:00 PM'] ]; $timestamp = time(); $status = '<span style="color:#fc2323">Closed now</span>'; $currentTime = (new DateTime())->setTimestamp($timestamp); foreach ($storeSchedule[date('l', $timestamp)] as $startTime => $endTime) { $startTime = DateTime::createFromFormat('h:i A', $startTime); $endTime = DateTime::createFromFormat('h:i A', $endTime); if (($startTime < $currentTime) && ($currentTime < $endTime)) { $status = '<span style="color:#23fc41">OPEN</span>'; $todayIs = "owen"; break; } } echo '<p style="padding-bottom:5px;">Hours: ' . $status . '</p>'; foreach($storeSchedule[date('l', $timestamp)] as $openHour => $closeHour) { echo "<p style='padding-bottom:15px' class=\"show-store-hours\">" . date('l') . ": " . $openHour . " - " . $closeHour . " +</p>"; } echo '<ul class="store-hours" style="margin: 0 auto; padding-bottom:25px">'; foreach ($storeSchedule as $storeDay => $hoursArray) { foreach ($hoursArray as $startTime => $endTime) { echo '<li>'; echo $storeDay; echo ': <span>'; echo $startTime; echo ' - '; echo $endTime; echo '</span></li>'; } } echo '<div class="clr"></div></ul>';?>
¿Qué tal tratar de agregar 1 día a su hora de finalización, si la hora de finalización es la medianoche? Creo que está viendo este resultado porque la hora de la medianoche es literalmente menor que todas las horas de inicio. Por ejemplo, de 10 a. m. a medianoche del viernes es en realidad (en términos de tiempo) equivalente a 10 a. m. del viernes a 12 a. m. del sábado.
También hay otra solución. Puede publicar sus horas de cierre como 11:59:59 p. m. y mostrar esas horas hasta la medianoche.
Para arreglar tu hora de finalización, podrías hacer
if ($endtime < $starttime) { $endtime=date_add($endtime, INTERVAL 1 DAY);}
No estoy seguro si esta es la mejor solución...
Pero esto funcionó para mí ... gracias por la ayuda.
if ( $endTime == "11:59 PM" ) { $endTime = "12:00 AM"; }Hago eco de esto en la página, después de que ya almacené el valor ABIERTO o CERRADO.
Puede comenzar con una cadena de formato H:i para comparar los objetos de fecha y hora y luego volver a formatearlos en g:i A .
La diferencia es :
H:i $a = DateTime::createFromFormat('H:i', '24:00'); print_r($a);DateTime Object ( [date] => 2017-04-30 00:00:00.000000 [timezone_type] => 3 [timezone] => Asia/Dubai )
g:i A $a = DateTime::createFromFormat('g:i A', '12:00 AM'); print_r($a);DateTime Object ( [date] => 2017-04-29 00:00:00.000000 [timezone_type] => 3 [timezone] => Asia/Dubai )
Entonces, puedes hacer algo como:
$a = DateTime::createFromFormat('H:i', '10:00'); $b = DateTime::createFromFormat('H:i', '24:00'); $c = new DateTime(); var_dump($c > $a && $c < $b);booleano (verdadero)
Y para formatear el objeto dateTime de nuevo al formato "12:00 AM":
print($b->format('g:i A'));12:00 A.M