0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 時間不對?時區設定與程式裡取時間的正確寫法

WordPress 時間不對?時區設定與程式裡取時間的正確寫法 封面

常見的時間問題:

  • 文章明明晚上 9 點發佈,網站上顯示下午 1 點,差了 8 小時。
  • WooCommerce 訂單時間、留言時間都不對。
  • 排程文章沒有準時上線,文章列表顯示「已錯過排程」。
  • 自己寫的程式印出的日期,半夜 12 點過後還是昨天。

這些大多是兩個原因:WordPress 的時區沒設好,或程式用了 PHP 原本的時間函式。

第一步:時區設成台北

到 設定 → 一般,找到「時區」,選擇「亞洲」底下的「台北」,按「儲存設定」。

下拉選單裡也有「UTC+8」這種手動時差的選項。台灣沒有日光節約時間,選哪一個時間都對,但建議選城市:

  • 選「台北」,WordPress 記錄的是時區名稱 Asia/Taipei。
  • 選「UTC+8」,記錄的只是 +08:00 這個時差。
  • 網站的客人或分公司在有日光節約時間的國家,手動時差到了夏天就會差 1 小時;選城市才會自動調整。

設好之後,後台的文章時間、排程發佈、WooCommerce 訂單時間,都會照台北時間顯示。

程式裡取時間:不要用 date()

自己寫程式時,最容易出錯的是 PHP 內建的 date()。我們在測試網站上,時區已經設成台北,台北時間是 10 月 15 日凌晨 0 點 40 分,各個函式的結果是:

  • date( 'Y-m-d H:i' ):2026-10-14 16:39,比台北慢了 8 小時,還是前一天。
  • wp_date( 'Y-m-d H:i' ):2026-10-15 00:40,正確。
  • current_datetime():2026-10-15 00:40,正確。

原因是 WordPress 啟動時,故意把 PHP 的預設時區設成 UTC(世界標準時間),WordPress 內部存的時間、排程,都以 UTC 為基準。所以在 WordPress 裡用 date(),拿到的永遠是 UTC 時間。

正確的寫法

PHP
// 現在時間(網站設定的時區)
echo wp_date( 'Y-m-d H:i' );

// 存進資料庫的時間,用時間戳記(全世界都一樣,不分時區)
$timestamp = time();

// 顯示的時候再換成網站時區
echo wp_date( 'Y 年 n 月 j 日 H:i', $timestamp );

// 要計算時間:拿一個帶時區的日期物件來算
$now      = current_datetime();
$tomorrow = $now->modify( '+1 day' )->setTime( 9, 0 );
echo $tomorrow->format( 'Y-m-d H:i' ); // 明天早上 9 點
  • wp_date():用法和 date() 一樣,但會照網站設定的時區顯示,月份、星期也會跟著網站語言翻譯。
  • 時間戳記(time() 拿到的那串數字)全世界都一樣,不分時區。要存進資料庫或比較先後,用時間戳記最不會出錯,顯示的時候再用 wp_date() 換成網站時區。
  • current_datetime() 回傳一個帶著網站時區的日期物件,要加一天、設定成幾點,用它計算,跨過半夜也不會算錯。測試時算出的「明天早上 9 點」是 2026-10-16 09:00,正確。
  • 舊教學常用的 current_time( 'timestamp' ),WordPress 官方已經不建議使用,它回傳的是「加上時差的假時間戳記」,拿去做其他計算很容易又差 8 小時。

不要用 date_default_timezone_set()

網路上有些教學會在 functions.php 加這一行,讓 date() 變成台北時間:

PHP
date_default_timezone_set( 'Asia/Taipei' );

請不要這樣做。WordPress 內部的時間計算都假設 PHP 的時區是 UTC,改掉之後,WordPress 和外掛算出來的時間可能出錯,而且這種錯很難查。測試網站加上這一行後,到 工具 → 網站狀態 檢查,結果直接變成嚴重問題:「PHP 預設時區無效」。

實用範例:顯示「現在營業中」

照網站時區判斷現在是不是營業時間,顯示不同的文字:

PHP
// 短代碼 [zw_open_now]:依網站時區判斷現在是不是營業時間(週一到週五 9:00–18:00)
add_shortcode( 'zw_open_now', function () {
	$now  = current_datetime();
	$day  = (int) $now->format( 'N' ); // 1 是星期一,7 是星期日
	$time = $now->format( 'H:i' );
	if ( $day <= 5 && $time >= '09:00' && $time < '18:00' ) {
		return '<span class="zw-open">現在營業中,歡迎來電</span>';
	}
	return '<span class="zw-closed">目前休息中(營業時間:週一至週五 9:00–18:00),歡迎先用 LINE 留言</span>';
} );

在頁面放一個「短代碼」區塊,填 [zw_open_now]。

  • format( 'N' ) 拿到星期幾,1 是星期一、7 是星期日。
  • 時間用「時:分」的文字比較,'09:00' 到 '18:00' 之間就是營業中。
  • 測試時把網站時區換成紐約、倫敦、東京,判斷結果都和當地時間對得上。

要注意快取。網站有整頁快取的話,這段文字會跟著頁面一起被存下來,可能早上存的「營業中」到晚上還在顯示。用了快取外掛,要把放這個短代碼的頁面排除在快取之外。

排程文章「已錯過排程」

時區設對了,排程文章還是沒準時上線,通常跟時區無關,原因是 WordPress 的排程要「有人來看網站」才會執行。流量少的網站,可以改用主機的排程,做法請看WordPress 排程自動清理垃圾留言和修訂版本:WP-Cron 寫法裡的「WP-Cron 不是真的每天準時」。

延伸閱讀

時間顯示對不對,是客人信不信任網站的小細節。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站上線前會把時區、日期格式這些設定都檢查好,台北與全台客戶也歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!