2012-01-18 86 views
0

我目前正在將國際化支持添加到用PHP編寫的系統中。所有日期現在都存儲爲UTC,並根據個人用戶本地化偏好進行顯示。接受國際日期時間輸入php

然而當用戶輸入的日期時間(如指定一個特定時間窗),它們被輸入解釋爲UTC日期時間,而不是他們本地的日期時間的日期時間。爲了完成國際化,系統需要假定用戶輸入的日期時間是指當地時間。

如何轉換日期字符串(即 'YYYY-MM-DD HH:MM')爲Unix時間戳正確的定位?

  • 進一步明確 - 在數據庫中的所有日期= UTC時間戳 所有的HTML頁面顯示用戶本地時間(在其設置中定義) HTML表單有默認爲當前本地時間 PHP必須把該日期時間日期當地沒有UTC PHP必須在此日期本地TIMESTRING轉換爲UTC時間戳
+0

那麼你的問題沒有一個非常直接的答案。您需要將用戶GMT存儲在數據庫中,這樣就可以使用它的時間轉換 – 2012-01-18 11:49:54

+0

退房的本地時間()函數在PHP網站上http://php.net/manual/en/function.localtime.php – CBusBus 2012-01-18 11:51:07

+0

@ yankitwizzy也許我不清楚。是的,我將時間戳存儲爲UTC。根據定義,時間戳始終是UTC。這已經很好了。我遇到的問題是在用戶本地化中接受用戶輸入。 – AntonChanning 2012-01-18 15:36:11

回答

2

假設你知道用戶,這是他想必在喜好選擇某個地方的時區:

$timezone = new DateTimeZone($usersTimezone); 
$datetime = new DateTime('2012-01-18 20:00:00', $timezone); 
echo $datetime->getTimestamp(); 

這需要一個最近的PHP版本與DateTime

+0

這讓我走上了正軌,但日期似乎最終增加了兩倍的時區偏移量。例如,如果我的位置設置爲「歐洲/巴黎」,則表單上顯示的默認時間會在UTC/GMT之前1小時正確顯示(即我目前處於CET中)。但是,當我提交這些時間並使用上面的代碼處理它們時,請保存所產生的UTC時間戳,當我保存它們時,它們看起來會再增加一小時。它就好像DateTime將用戶輸入字符串視爲UTC一樣,而不是DateTimeZone對象定義的本地時間? – AntonChanning 2012-01-18 15:32:26

+0

其實我的錯誤。在插入數據庫之前,時間戳會被轉換回字符串,所以您的解決方案可以像廣告一樣工作。我只是在創建sql日期字符串的函數中暫時將默認時區設置爲UTC,然後在返回字符串之前恢復用戶設置。 – AntonChanning 2012-01-18 16:23:36