午夜时间问题

时间:2011-12-08 22:16:25

标签: php datetime time

我在检测商店是否在午夜后仍然营业或关闭时遇到问题。

周二($weekday = 2),商店营业时间为下午6点至凌晨1:30(午夜后)

假设当前时间是01:05 AM

    $weekday = 2;

    //Convert current time to minutes (01:05)
    $currentTime = ($weekday - 1) * 1440 + "01" * 60 + "05";

    //Current Week Day

    $shopOpenTime = "18:00";
    $shopCloseTime = "01:30";

    $open = explode(':', $shopOpenTime);
    $close = explode(':', $shopCloseTime);

    //Convert to Minutes;
    $MinutesOpen = (($weekday - 1) * 1440) + ($open[0] * 60 + $open[1]);
    $MinutesClose = (($weekday - 1) * 1440) + ($close[0] * 60 + $close[1]);
    if ($MinutesClose < $MinutesOpen)
        $MinutesClose += 60 * 24;


    if (($currentTime >= $MinutesOpen) && ($currentTime < $MinutesClose)) {
        echo "Shop Is Open";
    }  else { 
       echo "Shop Is Close";
     }  

解决此问题的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

老实说,应该重写整个代码块。逻辑注定是因为你的$ weekday参数将$ currentTime的当天比作$ minutesOpen。你添加了24小时到$ minutesClose将它推到(技术上是Wed),现在比较是正确的。它表示已关闭,因为您尚未将$ currentTime在24小时内结束。

所以,如果你只是用英语阅读这个,那就是星期二凌晨1:30(星期一晚上就在星期一晚上)和星期二下午6:30进行比较,这就失败了(这是因为$ weekday参数在$ currentTime中设置为星期二。

在没有看到你如何填充你的$ weekday参数的情况下,我猜测当你实际运行这个代码时使用date()函数弹出,在12:01(星期二),它会增加到星期三,然后你的代码将按照婚礼的时间填充开放和关闭时间,这也将是关闭的。

对不起,我知道这不是解决整个逻辑的解决方案,但它会在生产环境中产生巨大的缺陷。

如果你只想让它发挥作用,坚持'周二'的心态/背景,你必须反映周二的感觉当时的时间,那就是25:05意味着结婚时的1:05,而不是01:05星期二第二次。这使得上下文保持正确并且有效。

   $currentTime = ($weekday - 1) * 1440 + "25" * 60 + "05";

答案 1 :(得分:0)

您正在将当前时间与在当前时间开始的开放时间进行比较。但由于昨天开始的开放期,该店目前正在营业。只是与昨天的时期相比:

if ((($currentTime >= $MinutesOpen - 1440) && ($currentTime < $MinutesClose - 1440)) || (($currentTime >= $MinutesOpen) && ($currentTime < $MinutesClose))) {

但要注意,只有当商店每天同时打开/关闭时,这才有效。