2010-10-08 57 views
0

我一直堅持這兩天,並沒有得到任何地方。我傾向於考慮未來和將來出現的問題。我的服務器的時間設置爲UTC,並且linux盒子完全更新了時區以及數據在我的數據庫中。店鋪打開/關閉時間和DST變化

我會解釋我的系統的最佳答案。

本網站出售「物品」,但只能在開放和封閉時間銷售。該商店可以有分裂時間:即:從8 AM-12PM 1 pm-8pm開...等

所以我的時間表如下所示:

id (1) | store_id (1) | opens (08:00) | closes (21:00) 

上面有樣本數據旁邊的列名。基本上商店ID#1可能在洛杉磯(美國/太平洋),也可能在紐約市(美國/東部)。

確保我不會錯過一小時停機時間的最佳方式是什麼,以便我可以阻止用戶在下班時間從這些商店訂購。如果我的時間不是一小時,那麼一個小時,當他們真正開放時,沒有人可以訂購,一小時內用戶會在他們真正關閉時訂購。反之,根據時間的變化。

有沒有人處理過這個?如果是這樣,你是怎麼做到的?

什麼是我可以去解決這個問題的最佳途徑。我一直在處理它,在過去的48小時裏它正在吃掉我的大腦。

請幫忙! :)

+0

已經嘗試設置像offsetHour(+1)這樣的偏移量,因此您可以花費一些時間,如SELECT打開+ offsetHour AS'打開'FROM小時 – ITroubs 2010-10-08 08:23:49

+0

另一種解決方案是從cloudemade等地理系統請求時區,計算offsetHour該時區並將其存儲在您的數據庫中 – ITroubs 2010-10-08 08:25:49

回答

0

在Postgres和MySQL中實現它實際上非常容易。您只需將時區存儲在用戶端,將服務器TZ設置爲UTC,然後在兩者之間進行轉換。

EX:

SELECT 
    CASE WHEN (
     (CAST((CURRENT_TIMESTAMP at time zone s.timezone) as time) BETWEEN h.opens AND h.closes) AND 
     h.day = extract(dow from CURRENT_TIMESTAMP at time zone s.timezone)) THEN 0 ELSE 1 END 
    ) as closed 
FROM store s 
LEFT JOIN store_hours r ON s.id = r.store_id 
HERE h.day = extract(dow from CURRENT_TIMESTAMP at time zone s.timezone) 

這是類似的東西。我不得不以這種方式進行類型轉換,因爲我僅僅因使用Doctrine 1.2而受到限制。

即使有DST變化,它也可以像魅力一樣工作。

0

有一點要記住的是,有些地方(認爲亞利桑那州)不要做DST。你可能想確保你的數據庫有足夠的信息,這樣你就可以區分洛杉磯和菲尼克斯,如果有必要的話。

假設你遵循ITroubs的意見,並把補償在數據庫中(也可能是有關是否存儲在DST尊重的環境),你可以做到以下幾點:

建立你的代碼,以便它檢查DST是否有效,並適當地構建您的查詢。如果您的所有商店都在紐約和洛杉磯,那麼您可以在需要時將偏移量加1。如果不是,則需要使用針對DST和非DST商店的不同規則的查詢。類似的,

SELECT store_id 
FROM hours 
WHERE 
(supportsDST = true AND opens < dstAdjustedNow AND closes > dstAdjustedNow) 
OR (supportsDST = false AND opens < UTCNow AND closes > UTCNow) 

如果你走這條路線,我建議儘量集中和隔離處理這個問題的代碼。

此外,您不提這一點,但我認爲具有拆分時間的商店在小時表中會有兩行,每個塊都有一行打開。