我有一個PHP腳本設置MySQL會話的時區。我檢查了輸出,它正確發送偏移量,+1:00
(歐洲/倫敦在DST)。但是,當我讀取已放入數據庫的時間戳時,它已經晚了八個小時。這是爲什麼發生?SQL是由PHP設置的時區後面8小時
MySQL服務器將時間戳設置爲默認值。
我有一個PHP腳本設置MySQL會話的時區。我檢查了輸出,它正確發送偏移量,+1:00
(歐洲/倫敦在DST)。但是,當我讀取已放入數據庫的時間戳時,它已經晚了八個小時。這是爲什麼發生?SQL是由PHP設置的時區後面8小時
MySQL服務器將時間戳設置爲默認值。
更新數據庫參數:
SET GLOBAL time_zone = 'Europe/London';
// OR: SET time_zone = 'Europe/London';
// OR: SET @@session.time_zone = 'Europe/London';
更新時區直接在請求:
SELECT ..., CONVERT_TZ(field, 'GMT', 'Europe/London') FROM ...
定義在項文件(如index.php
)適當的時區:
date_default_timezone_set('Europe/London');
此外,它可以在服務器上完成(示例,Ubuntu):
sudo timedatectl set-timezone Europe/London
# do not forget to restart all services: nginx|Apache, mysql, ...
由於我在共享服務器上,因此我沒有使用'GLOBAL'的權限。但是,我已經運行了沒有GLOBAL的第一個命令 - 但是我傳遞了'+1:00'的值。 – StellarDoor5319
@ StellarDoor5319在這種情況下,您可以直接爲您的賬戶更改參數(刪除'GLOBAL')。也可以在數據庫中轉換所有值:'CONVERT_TZ(field,'GMT','Europe/London')' – FieryCat
我已更新答案;) – FieryCat
我的PHP腳本已經將此命令作爲'multi_query()'語句的一部分運行。 MySQL插入後直接運行。 – StellarDoor5319
「默認值」是服務器的值。在服務器上設置的時區是什麼? (在命令行中使用'date',它應該顯示時區) – aynber
@aynber我無法訪問命令行,因爲這是共享服務器。 – StellarDoor5319