2011-08-31 125 views
0

我有一個網站可以將數據加載到MySQL表中。表中的兩個條目是「startdate」和「enddate」。 'startdate'是使用CURRENT_TIMESTAMP自動執行的。 'enddate'是用戶使用日期選擇器選擇的。PHP同步時區夏時制問題

如果用戶位於與服務器不同的時區,則會產生問題。例如(我在太平洋時區,服務器在中央)。如果我在下午5點創建一個入口並選擇結束日期爲晚上10點,它會在晚上7點和晚上10點進入數據庫,創建一個3小時的窗口而不是5.我想要的是將結束日期轉換爲中央時間(相同作爲服務器)。因此,使用我的示例,我希望數據庫中的條目是下午7點和午夜12點。

我可以得到用戶時區與此JavaScript偏移:

var d = new Date(); 
var timezone = -d.getTimezoneOffset()/60; 

這將返回-7(我在GMT-8,我假定1小時的DIF是因爲夏令時) 。我首先想到的解決方案是假設服務器在-5,並比較兩個(回到我的例子,-5 - -7 = 2,所以加2到'enddate')。

問題出現在我們切換回標準時間。我認爲我的JavaScript將開始返回-8而不是-7,打破了我的功能。我知道PHP的date_default_timezone_get(),但是它返回一個字符串而不是數字。我想我需要的是一個類似的功能,可以(對於中央時間)在日光節約期間返回-5,在標準時間期間返回-6。

+1

你不能以UTC獲得所有相關日期嗎? –

+0

如果你使用的是mysql'timestamp'字段 - 那麼一切都應該沒問題。只需在mysql會話開始時指定正確的客戶端時區即可。 – zerkms

+0

我使用時間戳只用於始終是中心時間的'startdate'。 'enddate'來自日期選擇器,它基於用戶的當地時間。我需要一種方法將用戶的本地時間轉換爲中央時間。 – user617123

回答

2

使用mysql時間戳字段。

或以UTC保存所有數據,然後在php中完成需要做的事情。

0

使用MySQL的UTC_TIMESTAMP而不是CURRENT_TIMESTAMP,將'startdate'轉換爲UTC時間。我的javascript代碼:

var d = new Date(); 
var timezone = -d.getTimezoneOffset()/60; 

可用於將'enddate'轉換爲UTC時間。現在一切都在UTC並且匹配。