2016-06-25 17 views
1

我住在斯里蘭卡。我有這段代碼來記錄無效登錄完成時的當前日期和時間。PHP mySQL CURRENT_TIMESTAMP在cPanel數據庫中顯示的時間不正確

$insert_query = "INSERT INTO LoginAttempt(IpAddress, LoginAt) VALUES('". $_SERVER['REMOTE_ADDR']. "', CURRENT_TIMESTAMP)"; 

我已經上傳到hostinger.co.uk這是免費的webhosting服務的教育目的。

成功插入表中。它顯示日期正確。但時間比實際時間少5小時30分鐘。 有沒有辦法改變cPanel中的時區或以編程方式在PHP腳本中?

我試過的東西;

1)加入此。但不起作用! date_default_timezone_set( '亞/科倫玻');

另一個使用DATE_ADD函數來添加特定缺失小時的功能。

你還有什麼想法?謝謝

MySQL表;

CREATE TABLE LoginAttempt(
    LoginId INT NOT NULL AUTO_INCREMENT, 
    IpAddress VARCHAR(20) NOT NULL, 
    LoginAt DATETIME NOT NULL DEFAULT NOW(), 
    PRIMARY KEY(LoginId) 
); 

解決方案奏效!!!!

$insert_query = "INSERT INTO LoginAttempt(IpAddress, LoginAt) VALUES('". $_SERVER['REMOTE_ADDR']. "', CONVERT_TZ(NOW(), 'UTC', 'Asia/Colombo'))"; 
+1

所以你想更新日期時間或只是爲「SELECT」查詢? –

+1

http://stackoverflow.com/a/19069310/4248472 – Zimmi

+0

@YahooI想用正確的時區更新數據庫表,而不是選擇。最後,我發現由Ollie Jones用戶 –

回答

3

英格蘭的這臺服務器可能在UTC時間運行。斯里蘭卡,並非巧合,在UTC之前5點半。您的服務器當然會在您的表格中記錄正確的時間。它只是在錯誤的區域。

這些操作共享服務器的人不會爲您改變這種情況:您與全球各地的人共享服務器。 (請注意,它被認爲是很好的做法,處處操作上UTC時間服務器,因此如果你的服務器是在大廳,你也有同樣的問題。)

更改LoginAt列的數據類型從DATETIMETIMESTAMPTIMESTAMP值始終以UTC記錄,並且在顯示時總是翻譯爲本地時間。

然後,當你連接到MySQL(從程序或在phpMyAdmin)發出你已經發現了

SET time_zone = 'Asia/Colombo' 

命令,你做任何事情之前。然後你會看到你的TIMESTAMP數據顯示在當地時間。

或者,如果您有現有的DATETIMEDATE您知道的時間數據記錄爲UTC,您可以convert it in MySQL using CONVERT_TZ()。例如,

SELECT CONVERT_TZ(LoginAt, 'UTC', 'Asia/Colombo') LoginAt, ... 

會在當地時間爲您提供您的信息。

知道的事情是,TIMESTAMP數據類型,NOW()CURDATE()CURRENT_TIMESTAMP等所使用的時區設置檢索。 DATETIMEDATE不是。因此,您的程序會將CURRENT_TIMESTAMP隱式轉換爲UTC本地時間,並將其存儲到您的DATETIME列中,將時間凝固爲UTC。

如果您的程序將其存儲到TIMESTAMP列中,則存儲時間的時區不會被凍結。或者,如果您的程序在發出查詢之前發出set time_zone = 'Asia/Colombo'命令,它會將時間凝固到當地時間,然後將其存儲到您的DATETIME列中。

令人困惑?是。

+0

的解決方案感謝您的全面解答。我會嘗試所有這些一步一步地花費足夠的時間。然後我會標記你接受的答案。 –

+0

最後感謝我找到解決方案。在我的問題中看到我更新的答案。 –