2012-03-03 34 views
7

En PHP y MySQL: cómo determinar si la tienda está abierta o cerrada (¿es verdadero o falso?¿Determinar si la tienda está abierta?

¿También cómo obtener el próximo horario de apertura si la tienda está cerrada?

Ejemplo de Opening_Hours tabla:

+----+---------+----------+-----------+------------+---------+ 
| id | shop_id | week_day | open_hour | close_hour | enabled | 
+----+---------+----------+-----------+------------+---------+ 
| 1 |  1 |  1 | 16:30:00 | 23:30:00 |  1 | 
| 2 |  1 |  2 | 16:30:00 | 23:30:00 |  1 | 
| 3 |  1 |  3 | 16:30:00 | 23:30:00 |  0 | 
| 4 |  1 |  4 | 16:30:00 | 23:30:00 |  1 | 
| 5 |  1 |  5 | 10:00:00 | 13:00:00 |  1 | 
| 6 |  1 |  5 | 17:15:00 | 00:30:00 |  1 | 
| 7 |  1 |  6 | 17:15:00 | 01:30:00 |  1 | 
| 8 |  1 |  7 | 16:30:00 | 23:30:00 |  0 | 
+----+---------+----------+-----------+------------+---------+ 

El open_hour y close_hour son campos de tipo de tiempo. ¿Diseño de mesa está bien?

Ejemplo de los tiempos actuales:

  • Hora: mar 23:00 - salida: Abierto, 'abierta en mar 16:30-23:30'

  • hora: 23:40 mar, - salida: Cerrar, 'abierta en jue 16:30-23:30'

abierto el jueves debido a Opening_Hours.week_day = 3 está desactivado


Ahora cómo manejar el tiempo de la medianoche? Esto se vuelve más complicado.

Como se puede ver, el sábado (Opening_Hours.week_day = 5), que está abierta de 17:15 PM a 1:30 (día siguiente cerrado los domingos)

Si la hora actual es Domingo 1:15 AM, entonces el tienda todavía estaría abierta base en Opening_Hours.week_day = 5.

salida: Abierto, 'abierta en Sat 17:15-un y media'

+0

Favor de no repetir varias preguntas a la vez. Frena tu problema en partes más pequeñas y pregunta detalles. También esto parece una tarea que no es bienvenida aquí ... –

+5

@ JanHančič NO son preguntas múltiples a la vez.Mi pregunta es cómo averiguar si la tienda está abierta o cerrada. En segundo lugar, esto NO es tarea. – user1246800

+0

Me parece una tarea, pero si dices que no es así, entonces te creo :) –

Respuesta

3

En el pasado, he manejado mediante el uso de una marca de tiempo sin una fecha (segundos desde la medianoche). Entonces, para el sábado, el abierto sería 62100 y el cierre sería 91800.

Mi idea era que esto elimina parte de la lógica necesaria cuando un cierre cruza la medianoche, ya que solo necesita comparar los segundos desde el comienzo de la fecha hasta el rango de tiempo.

Y es bastante fácil comprobar si todavía está abierto desde 'ayer' - simplemente agregue 86400 al 'tiempo' actual (segundos desde el comienzo del día) y consulte con el día anterior.

Probablemente todo en una sola instrucción de SQL.

1

Puede usar la función PHP date() y compararla con sus horarios de apertura.

Usted puede hacer algo como esto función recursiva (no funciona el código PHP, pero combinado con PHP pseudo-código):

/* $current_time should be in the format of date("His") */ 
function check_hours($current_day, $current_time) 
{ 
    Get the MySQL row for today here 

    if (Opening_Hours.enabled == 1 WHERE Opening_Hours.week_day == $current_day) 
    { 
     if ((date("His") >= Opening_Hours.open_hour) and ($current_time <= Opening_Hours.close_hour)) 
     { 
      // convert_numeric_day_to_full_representation isn't a real function! make one 
      return 'Open: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     elseif (date("His") < Opening_Hours.open_hour) 
     { 
      return 'Closed: Next opening hours: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     else 
     { 
      return check_hours($tomorrow, '000000'); 
     } 
    } 
    else 
    { 
     return check_hours($tomorrow, '000000'); 
    } 
} 
Cuestiones relacionadas