當前位置: 首頁> 最新文章列表> 如何使用gmdate 輸出不同語言環境下的日期

如何使用gmdate 輸出不同語言環境下的日期

gitbox 2025-05-27

一、 gmdate基本用法

<?php
// 當前時間戳對應的 GMT 時間,格式化為 年-月-天 小時:分鐘:秒
echo gmdate('Y-m-d H:i:s');
?>

輸出示例:

 2025-05-24 06:30:00

這裡返回的是格林威治時間的當前日期和時間。


二、為什麼gmdate不能直接輸出本地化語言?

gmdate只會返回數字日期和時間部分,月份和星期不會轉換成語言文本。它不會根據系統的locale 設置改變語言。

例如:

 <?php
echo gmdate('l, F j, Y');  // 輸出類似:Saturday, May 24, 2025
?>

輸出總是英文的SaturdayMay


三、結合setlocale()strftime()實現多語言輸出

為了輸出本地語言的日期格式,通常用setlocale()設置區域語言環境,然後用strftime()輸出本地化的日期字符串。

strftime()使用的是服務器本地時間,要結合gmdate()得到的GMT 時間,可以用gmstrftime() (PHP 8.1 起可用),或者手動調整時間戳。

示例:

 <?php
// 設置語言環境為中文(中國)
setlocale(LC_TIME, 'zh_CN.UTF-8');

// 使用 gmstrftime 輸出 GMT 時間的本地化天期
echo gmstrftime('%A %e %B %Y', time());
?>

這會輸出中文的星期幾、月份等。例如:

 星期六 24 五月 2025

注意: gmstrftime()在較老的PHP 版本中可能不可用,可考慮使用strftime()並手動轉換時間為本地時間。


四、手動本地化示例:用數組映射英文到其他語言

如果服務器沒有安裝所需的語言包,或者想更靈活地控制語言,可以手動映射英文月份和星期到目標語言。

示例代碼:

 <?php
// 獲取 GMT 時間
$timestamp = time();

// 英文星期和月份
$week_en = gmdate('l', $timestamp);
$month_en = gmdate('F', $timestamp);

// 中文星期和月份映射
$week_map = [
    'Monday' => '星期一',
    'Tuesday' => '星期二',
    'Wednesday' => '星期三',
    'Thursday' => '星期四',
    'Friday' => '星期五',
    'Saturday' => '星期六',
    'Sunday' => '星期天',
];

$month_map = [
    'January' => '一月',
    'February' => '二月',
    'March' => '三月',
    'April' => '四月',
    'May' => '五月',
    'June' => '六月',
    'July' => '七月',
    'August' => '八月',
    'September' => '九月',
    'October' => '十月',
    'November' => '十一月',
    'December' => '十二月',
];

// 拼接輸出中文格式天期
$day = gmdate('j', $timestamp);
$year = gmdate('Y', $timestamp);

echo $week_map[$week_en] . " " . $day . " " . $month_map[$month_en] . " " . $year;
?>

輸出:

 星期六 24 五月 2025

五、總結

  • gmdate()用於基於GMT 時間格式化數字日期時間。

  • 它不支持多語言環境的文本輸出。

  • 要實現多語言顯示,可以配合setlocale() + gmstrftime() ,或者自行映射日期文本。

  • 根據實際服務器環境和PHP 版本,選擇合適的方法。


參考示例完整代碼

<?php
// 設置語言環境
setlocale(LC_TIME, 'zh_CN.UTF-8');

// 獲取当前 GMT 時間戳
$timestamp = time();

// 使用 gmstrftime 輸出本地化天期(GMT 時間)
echo gmstrftime('%A %e %B %Y', $timestamp);

// 或手動映射(見上面示例)
?>