2013-08-20 36 views
3

我研究這個了很多,但沒有答案具體爲我的問題.. (我發現,所以如果你發現類似的,請與我裸露。)MySQL和PHP時區

在我PHP.ini文件I設置像這樣的時區...

'America/New_York' 

所以,當我跑了一個簡單的PHP date()函數

echo date("Y-m-d H:i:s"); 

根據「我的」系統時間,我得到了正確的日期時間,因爲這是我比較的對象,並且希望存儲在我的MySQL數據庫中。 (從PHP報告)。

現在的問題是,我導出的MySQL數據庫爲PDF格式,只是爲了看看是什麼樣子,時間爲1小時回,恩..這是(10:00)在這裏和PDF頁腳說(9:00)


所以.. 我開始思考 ..我的PHP腳本將INSERT到數據庫正確的日期時間,我需要..但我有很多的日期時間的比較

我知道如果我在phpMyAdmin中運行任何MySQL查詢,那麼我將g et 錯誤 dateTime。

我試圖在(phpMyAdmin的SQL查詢)運行

SET time_zone = 'America/New_York'; 
-and- 
SET time_zone = '-05:00'; 

但是當我運行查詢

SELECT @@global.time_zone, @@session.time_zone; 

我回來SYSTEMSYSTEM

(我還要提到我是在共享主機)

如果我在查詢中使用MySQL NOW()功能,進入該數據庫的時間就會被MySQL,根據它自己的時區計算。

這樣的..

mysql_query("INSERT INTO table (id, value, time_created) 
         VALUES ('{$id}', '{$value}', NOW())"); 

我明白,我必須盡我INSERTING,並在PHP中保持正確的時間比較..但與上面,它會插入錯誤時間。

,所以這是我的困境...

但是,這會不會影響任何東西,我沒有預見?我只是覺得這會影響我的時代。

那麼我該如何解決這個問題或者在同一個時區獲得MySQL?並確保所有我的日期/時間是正確的,而不是1小時的背後..

謝謝..

+0

可能是像夏令時,我只是gueesing – Notepad

+0

你的代碼應該改變會話時區就好:[fiddle](http://sqlfiddle.com/#!9/d41d8/304)。你究竟如何運行它? –

回答

0

根據你可以這樣做,你可能不會做什麼(在你的共享主機),你可以選擇是使用下面的語句爲您所有的疑問開始:"set time_zone='-05:00';",例如:"set time_zone='-05:00'; select foo from bar;"或(也許是最可靠的選項):只在表和查詢中使用時間戳,並根據您收到的時間戳在PHP中創建DateTime對象。

+0

謝謝,它可能更容易,只是確保PHP負責設置所有日期/時間將它們存儲在$ vars中,然後將INSERT作爲數據,而不是DateTime或Timestamp – SecureCloud

+0

請注意,MySQL會將'TIMESTAMP'值轉換爲會話的時區,與「DATETIME」值不同。 – RandomSeed

+0

@RandomSeed:謝謝,我會先測試一下,我不知道.. – SecureCloud

0

兩個查詢連續運行通過PhpMyAdmin將在兩個單獨的會話(連接)中執行,因此SELECT @@session.time_zone單獨將始終返回「SYSTEM」。

我懷疑你可以(而且我希望你不能)在共享服務器上更改全球時區,所以總是期望「SYSTEM」爲SELECT @@global.time_zone。另一方面,您應該可以更改會話的時區。

嘗試運行在一個執行這兩個查詢,它應該顯示新的時區:

SET time_zone = '-05:00'; SELECT @@session.time_zone; -- same session 

NOW()返回時間在當前會話時區,所以時區很重要。不過,我寧願在GMT時區存儲時間,但我認爲這更多的是品味。