Определить, открыт ли магазин? - PullRequest
7 голосов
/ 03 марта 2012

В PHP и MySQL - как определить, является ли Магазин открытым или закрытым (вернуть true или false)?

Также, как получить следующие часы работы, если магазин закрыт?

Пример таблицы Opening_Hours:

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

open_hour и close_hour - это поля типа TIME.Дизайн таблицы в порядке?

Пример текущего времени:

  • Текущее время : вт 23:00, - выход :Open, 'Open at Tue 16:30 - 23: 30'

  • Текущее время : Вт 23:40, - Выход : Закрыть, 'Открыто в четверг 16:30 - 23:30'

Открыто в четверг, потому что Opening_Hours.week_day = 3 отключено


Теперь, как работать с полуночным временем?Это усложняется.

Как вы можете видеть, в субботу (Opening_Hours.week_day = 5) он открыт с 17:15 до 01:30 (закрыто на следующий день в воскресенье)

Еслитекущее время - воскресенье 01:15, тогда магазин по-прежнему будет открыт на базе Opening_Hours.week_day = 5.

Выход : открыто, 'открыто в субботу 17:15 - 01:30'

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Раньше я справлялся с этим, используя отметку времени без даты (секунды с полуночи). Таким образом, в субботу открытие будет 62100, а закрытие будет 91800.

Я думал, что это удаляет некоторую логику, необходимую, когда закрытие пересекает полночь, поскольку вам нужно только сравнить секунды с начала даты и временной диапазон.

И довольно просто проверить, открыт ли он со вчерашнего дня - просто добавьте 86400 к текущему времени (в секундах с начала дня) и сравните с предыдущим днем.

Вероятно, все это один оператор SQL.

1 голос
/ 03 марта 2012

Вы можете использовать функцию PHP date () и сравнить ее с часами работы.

Вы можете сделать что-то вроде этой рекурсивной функции (не работает PHP-код, но PHP в сочетании с псевдокодом):

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