确定商店是否开放?

时间:2012-03-03 12:38:11

标签: php mysql database-design strtotime

在PHP和MySQL中 - 如何确定Store是打开还是关闭(返回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_hourclose_hour是TIME类型字段。表设计好吗?

当前时间示例:

  • 当前时间:星期二23:00, - 输出:打开,'星期二下午16:30 - 23:30开放'

    < / LI>
  • 当前时间:星期二23:40, - 输出:关闭,'在16:30 - 23:30开放'

    < / LI>

周四开放,因为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 个答案:

答案 0 :(得分:3)

过去,我通过使用没有日期的时间戳(午夜后的秒数)处理了这个问题。因此,对于星期六,开放时间为62100,收盘价为91800

我的想法是,这会消除当一个收盘越过午夜时所需的一些逻辑,因为你只需要比较从日期开始到时间范围的秒数。

我们很容易检查它是否仍然在昨天开放#&#39; - 只需将86400添加到当前&#39;时间&#39; (自当天开始以来的秒数)并检查前一天。

可能只是一个SQL语句。

答案 1 :(得分:1)

您可以使用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');
    }
}