2020年6月16日 星期二

[程式設計]解決PHP中UTC時區時間錯誤問題

通常我寫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的資料。

沒有留言:

張貼留言