2014-04-01 49 views
0

我有一個CodeIgniter應用程序,它的時區在config.php文件中設置爲gmt。MySQL TIMESTAMP僅在RDS中存儲爲0000-00-00 00:00:00?

$config['time_reference'] = 'gmt'; 

我注意到兩兩件事:

  1. 我的本地數據庫設置一個TIMESTAMP在數據庫中而不是GMT即使我已經明確地設置它。這是爲什麼?
  2. 我的生產Amazon RDS數據庫將所有TIMESTAMPS設置爲0000-00-00 00:00:00。這是爲什麼?

請記住,我沒有明確地在我的任何模型中傳遞時間參考。我將表設置爲在插入記錄時自動插入TIMESTAMP。

回答

1
  1. PHP和MySQL中的時區配置是兩回事。雖然您將其配置爲PHP中的GMT,但MySQL仍將其視爲/etc/my.cnf文件中default-time-zone='timezone'指令中設置的時間戳。您可以使用此查詢檢索當前的MySQL時區配置:

    SELECT @@global.time_zone, @@session.time_zone; 
    
  2. 這太依賴於實現。雖然你提到你不通過任何時間引用,但我確信CodeIgniter會以這種或那種方式爲你做到這一點。你應該顯示一些代碼,因爲我懷疑在CodeIgniter中有這樣的錯誤,所以你很可能會設置錯誤。 更新由於時區差異,這很可能會發生。如果您嘗試在將來保存時間戳,它將默認爲0000-00-00 ...

+0

OK,我跑您在我的本地機器和RDS上的查詢。我的本地機器都返回SYSTEM,RDS返回UTC(這是我想要的)。這至少解釋了我的本地機器問題,但是,爲什麼RDS將它作爲​​0插入到數據庫中? – Nag

+0

當您提供無效的時間戳時,插入0。我猜想你正在嘗試添加時間戳,哪個數據庫認爲是未來(由於時區差異),因此它寫入0.它始終在時間戳無效時寫入0。 – phoops

+0

我實際上並沒有在模型中手動傳遞任何時間戳。我有表設置,以便插入新記錄時插入TIMESTAMP到created_on列中。我的生產服務器在PST,但我希望UTC,所以它不能在未來。 – Nag

1

您需要更改字段格式或插入值。 您也可以找到一些MySQL的功能,方便的 - 例如

$sql = 'INSERT INTO tbl VALUES (NULL,:col1,:col2,,NOW())'; 

CURDATE()或NOW(),但我個人會避免MySQL時間戳。他們可以意外地改變,破壞你的所有數據。我會使用DATETIME並手動設置所有值。

+0

您是否建議我編輯我的所有模型以手動插入日期? – Nag

+0

只需在你的代碼中放置now()/ CURDATE()函數!這將做到這一點!測試前!不要在生產上做流氓! kkk –

+0

所以不是在這裏解決真正的問題,我們只是重寫軟件來引入新的不同問題? – phoops

0

在您的活動表單中,您應該向服務器發送一個隱藏的輸入信息,其中包含客戶端的時區偏移量。你可以通過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; 
+0

我不是真的存儲用戶的時區,我也不需要它。我的服務器返回它的本地時間表,基本上需要轉換爲UTC。在進行數據庫插入時,CodeIgniter會執行$ config ['time_zone']參考嗎?我的數據庫已經設置爲UTC。 – Nag