当前位置: 首页> 最新文章列表> 如何使用 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);

// 或手动映射(见上面示例)
?>