2011-12-08 176 views
0

我有問題檢測到商店在午夜後仍然開放或關閉。午夜時間問題

週二($weekday = 2),從下午6點店開到凌晨1:30(午夜後)

假設當前時間是上午01時05分

$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"; 
    } 

什麼是解決這個問題的解決問題?

回答

0

您正在比較當前時間與將在當前時間當天開始的開放時間段。但是由於昨天開幕,這家商店目前開放。只是昨天的週期也比較:

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

但要注意,這僅適用,如果店開/閉每天在同一時間。

+0

每天,店鋪開/關時間可能會有所不同。例如:星期一18:00至23:30,星期二11:00至22:00,星期五13:00至01:00(午夜後)。那麼解決方案是什麼? –

1

老實說,應該重寫整個代碼塊。邏輯註定會失敗,因爲您的$ weekday參數比較$ currentOn的同一天爲$ minutesOpen。你增加了24小時到$分鐘關閉推到(技術上星期三),現在比較是正確的。它說關閉,因爲你沒有把24小時內的$ currentTime移動到週三。

所以,如果你只是用英語閱讀這篇文章,你會在星期二凌晨1點30分(星期二晚上的時間)比較星期二下午6點30分,這樣做是失敗的(這是因爲工作日參數設置爲$ currentTime中的星期二)。

沒有看到你如何填充你的$ weekday參數,我猜測,當你實際運行這個代碼被彈出與說date()函數,在12:01(星期二)它將增加到結婚,那麼你的代碼將會在星期三的時間裏填充開放和關閉的時間,這也將被關閉。

對不起,我知道這不是一個解決方案,說重新編寫整個邏輯,但它將在生產環境中存在大量缺陷。

如果你只是想讓它工作,留在「星期二」的思維/背景下,你必須從星期二的意義上反映出當前時間,那就是25:05意思是1:05在星期三,而不是01: 05第二次星期二。這保證了上下文的正確性並且工作正常。

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

啊,我明白你想說什麼..你已經很好地解釋了我的邏輯。你沒有說適當的解決方案應該是什麼?你的意思是你最後一句話是適當的解決方案嗎...我在某一天(一週中的某一天)尋找的解決方案將具有不同的開啓/關閉時間。例如:Shop A公司(星期一18:00至23:30,星期二11:00至22:00,星期五13:00至01:00(午夜後))......如果會議記錄(INT)應該是存儲在數據庫中還是使用TIME字段類型? –