在您的活動表單中,您應該向服務器發送一個隱藏的輸入信息,其中包含客戶端的時區偏移量。你可以通過Javascript的Date.getTimezoneOffset()方法得到它(它給你UTC和用戶本地時間之間的分鐘偏移量)。
如果您不能這樣做,您可以將用戶的本地時區保存到數據庫中,或者在您的事件表單中提問。
然後,在您的INSERT或UPDATE查詢中,您可以使用DATE_ADD('2012-12-13 19:41:00',[用戶偏移量] MINUTE)轉換時間戳。你也可以做到這一點在PHP中,或客戶端提交表單時...
例如在PHP中:
strtotime($event_date);
爲您提供了日期的Unix時間戳(所以,單位爲秒)。把它轉換成另一個時區,根據你在使用JavaScript方法偏離的分鐘數,你可以這樣做:
$dbTimestamp = strtotime($event_date) + $_POST['offsetInMinutes']/60;
如果你得到抵消這種形式:「+2:00」或「-6:00 +2 '到$匹配[1]
還有一句:
首先,設置你的主人時的參考:」
preg_match('/(.*)\:00/', '+2:00', $match)
將設置,你可以在小時使用正則表達式偏移'到'GMT'在你身上[R配置文件:在http://ellislab.com/codeigniter/user_guide/helpers/date_helper.html
$config['time_reference'] = 'gmt';
選擇時區參考或使用timezone_menu()設置一個變量或在下面的代碼更新$時區一個DB列:
$time = now();
$timezone = 'UM5';
$daylight_saving = TRUE; // or FALSE
$local_time = unix_to_human(gmt_to_local($time, $timezone, $daylight_saving));
echo $local_time;
OK,我跑您在我的本地機器和RDS上的查詢。我的本地機器都返回SYSTEM,RDS返回UTC(這是我想要的)。這至少解釋了我的本地機器問題,但是,爲什麼RDS將它作爲0插入到數據庫中? – Nag
當您提供無效的時間戳時,插入0。我猜想你正在嘗試添加時間戳,哪個數據庫認爲是未來(由於時區差異),因此它寫入0.它始終在時間戳無效時寫入0。 – phoops
我實際上並沒有在模型中手動傳遞任何時間戳。我有表設置,以便插入新記錄時插入TIMESTAMP到created_on列中。我的生產服務器在PST,但我希望UTC,所以它不能在未來。 – Nag