2010-10-07 84 views
1

基本上我有一個網站,允許商店存儲他們的打開/關閉時間。MySQL/PHP中的時區偏移(和st/dst更改)

現在,我試圖添加讓訪客能夠查看商店是否關閉的功能。

我明白我可以運行一個查詢,如:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `opens` AND `closes` 

...和查詢工作,並檢索當前打開的商店。不過,起初這個查詢沒有考慮到商店的時區。

所以..我決定到商店的開啓/關閉時間與轉換爲UTC附加存儲:

ID | store_id |打開|關閉| utc_opens | utc_closes

現在我可以查詢,像這樣:

SELECT * FROM `store_hours` WHERE TIME(NOW()) BETWEEN `utc_opens` AND `utc_closes` 

所以,現在我可以很容易地得到一個全局列表中有多少商店是開放的,它甚至不不管他們在哪裏。

現在我來解決這個問題。通過PHP,我所做的只是添加偏移時間戳:

date('H:i', strtotime($values['closes']) + $offset) 

然後我開始思考太平洋標準時間,然後夏令時。

我想添加這個打開/關閉功能,它將成爲系統的一個重要組成部分。如果我休息一小時,那隻會讓我失去很多收入。

回答

2

我從來沒有處理這之前(我也不以往任何時候都願意這樣做,因爲它是一個煩人複雜的問題)。這就是說,有一些方法來解決這個問題:

how do you deal with timezone issues?

看來,如果你希望你的系統並不完美,但相當該死的,你必須潛入這樣的事情:

http://en.wikipedia.org/wiki/Zoneinfo

總之,問題是粒度複雜性之一。無論您嘗試多麼努力,您都無法編寫一個簡單的腳本,只給出一個靜態GMT偏移量來確定商店的準確時間。爲了解決這個問題,人們把公共數據庫放在一起,這些數據庫幾乎涵蓋了時區中固有的所有小角落和裂縫。即使你知道用戶在美國西部(落基山脈以西),你也不知道他是在巴斯托還是鳳凰城(亞利桑那州不做DST,所以半年的時間與洛杉磯的時間相同,另一半與丹佛一樣)。

所以回到數據輸入你去...你只需要在每個商店的確切時區代碼,並查詢zoneinfo數據庫來確定當前的偏移應該是什麼。