2012-03-03 2 views
7

In PHP e MySQL - come determinare se il negozio è aperto o chiuso (restituisce vero o falso)?Determina se il negozio è aperto?

Anche come ottenere gli orari di apertura successivi se il negozio è chiuso?

Esempio di Opening_Hours tavolo:

+----+---------+----------+-----------+------------+---------+ 
| 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 | 
+----+---------+----------+-----------+------------+---------+ 

Il open_hour e close_hour sono campi di tipo tempo. Design del tavolo ok?

Esempio di tempi attuali:

  • Orario: mar 23:00 - Uscita: Aperto, 'Aperto a Mar 16:30-23:30'

  • orario: mar 23:40, - uscita: Close, 'Aperto a Thur 16:30-23:30'

Aperto il Giovedi perché Opening_Hours.week_day = 3 è disabilitato


Ora come gestire il tempo di mezzanotte? Questo diventa più complicato.

Come potete vedere, il Sabato (Opening_Hours.week_day = 5), è aperto dalle 17:15 PM alle 01:30 (giorno successivo chiuso la Domenica)

Se l'ora corrente è Domenica 01:15, poi il il negozio sarebbe ancora aperto su Opening_Hours.week_day = 5.

Uscita: Aperto, 'Aperto a sab 17:15-1:30'

+0

Si prega di non inviare più domande in una sola volta. Frena il tuo problema in parti più piccole e chiedi informazioni specifiche. Anche questo sembra un compito a casa che non è il benvenuto qui ... –

+5

@ JanHančič NON sono domande multiple in una volta.La mia domanda è come scoprire che il negozio è aperto o chiuso. In secondo luogo, questo NON è compito. – user1246800

+0

A me sembra un compito, ma se dici che non lo è, allora ti credo :) –

risposta

3

In passato, ho gestito questo utilizzando un timbro tempo senza una data (secondi dalla mezzanotte). Quindi per sabato l'open sarebbe 62100 e la chiusura sarebbe 91800.

Il mio pensiero è stato quello di rimuovere parte della logica necessaria quando una stretta incrocia la mezzanotte, poiché è sufficiente confrontare i secondi dall'inizio della data all'intervallo di tempo.

Ed è abbastanza semplice controllare se è ancora aperto da "ieri" - basta aggiungere 86400 all'ora corrente (secondi dall'inizio della giornata) e controllare il giorno precedente.

Probabilmente tutta una singola istruzione SQL.

1

È possibile utilizzare la funzione di data() di PHP e confrontarla con gli orari di apertura.

si può fare qualcosa di simile funzione ricorsiva (non funzionante codice PHP, ma PHP combinato con pseudo-codice):

/* $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'); 
    } 
}