
常見的時間問題:
- 文章明明晚上 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 時間。
正確的寫法
// 現在時間(網站設定的時區)
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() 變成台北時間:
date_default_timezone_set( 'Asia/Taipei' );請不要這樣做。WordPress 內部的時間計算都假設 PHP 的時區是 UTC,改掉之後,WordPress 和外掛算出來的時間可能出錯,而且這種錯很難查。測試網站加上這一行後,到 工具 → 網站狀態 檢查,結果直接變成嚴重問題:「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 不是真的每天準時」。
延伸閱讀
- WordPress 後台「設定」新手指南:7 個分頁的重要選項與建議值
- Joomla 日期格式怎麼改?用語言覆寫與 HTMLHelper 改成台灣習慣的年月日
- WordPress functions.php 實用程式碼整理:10 個常用又安全的小技巧
時間顯示對不對,是客人信不信任網站的小細節。正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站上線前會把時區、日期格式這些設定都檢查好,台北與全台客戶也歡迎來聊聊。







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