通常我寫PHP都是以Asia/Taipei時區,但有些程式偏偏都是使用UTC時間,實體伺服器很少遇到問題,但是雲端主機VPS就很常出現時間問題了,原因是硬體時間跟作業系統時間通常是不一致的,我們只能改變作業系統的時間,所以有些地方會怪怪的。
寫了一支程式測試PHP裡面讀取到的系統時間,這次出問題的是Wordpress系統,它的發文機制都是使用排程的原理,由於Wordpress抓取的都是UTC時間,然後在抓取你安裝時挑選的時區去換算,所以如果UTC時區錯誤的話,算出來的時間就會差8小時,屆時你怎麼發文都是8小時前的錯誤時間。
<?php // 獲取預設時區 echo "預設時區: ".ini_get("date.timezone")."<br />"; // 獲取當前時區 echo "當前時區: ".date_default_timezone_get()."<br />"; // 當前時間 echo "當前時間: ".date("Y-m-d H:i:s")."<br />"; echo '<br />'; date_default_timezone_set("Asia/Taipei"); echo "當前時區: ".date_default_timezone_get()."<br />"; echo "時間: ".date ("Y-m-d H:i:s"); echo '<br /><br />'; date_default_timezone_set('America/Virgin'); echo "當前時區: ".date_default_timezone_get()."<br />"; echo "時間: ".date ("Y-m-d H:i:s"); echo '<br /><br />'; date_default_timezone_set("GMT"); echo "當前時區: ".date_default_timezone_get()."<br />"; echo "時間: ".date ("Y-m-d H:i:s"); echo '<br /><br />'; date_default_timezone_set("UTC"); echo "當前時區: ".date_default_timezone_get()."<br />"; echo "時間: ".date ("Y-m-d H:i:s"); ?>
這段程是就發現,UTC的時間居然跟GMT時間不一樣,而且差了8小時,顯然UTC時間是Localtime(台北+8的時區),看起來很容易,會不會伺服器設定時區的問題?
從ssh看看時區是不是有跑掉,指令timedatectl
顯然系統裡面的UTC時間是正確的,但為何PHP裡面的UTC時區會錯誤呢?這邊也不是時間同步的問題,所以這篇就不提及同步時間伺服器了。
試著修改php.ini,設定date.timezone = Asia/Taipei
只有改變PHP裡面的當前時區而已,並沒有影響UTC時間,所以這也不是解法。既然不是系統時間,那就單純是PHP讀取UTC的BUG了。
找到一個工具linux套件tzdata,可以用 yum install tzdata 或者 apt install tzdata
安裝完就解決囉,其實就是PHP抓UTC的時候抓不到,因為是雲端虛擬機器,PHP這個版本沒有虛擬機UTC時間,所以必須安裝tzdata才能讓PHP真正抓到UTC的資料。
沒有留言:
張貼留言