gmdate 永远以 utc 格式化时间戳,无视 date_default_timezone_set 设置;date 则按本地时区转换输出。二者对同一时间戳的输出差值即为本地时区偏移量(如 +0800)。

gmdate 和 date 都输出格式化的时间字符串,但底层时区处理逻辑完全不同:date 用本地时区(由 date_default_timezone_set 或 php.ini 决定),gmdate 永远用 UTC,不看任何时区设置。
gmdate 不受 date_default_timezone_set 影响
gmdate 的行为是硬编码的——它把输入的 timestamp 当作“已知的 UTC 时间点”,直接按 GMT 格式化输出,完全忽略当前脚本设置的时区。
- 即使你写了
date_default_timezone_set('Asia/Shanghai'),gmdate('H:i', time())依然返回 UTC 时间(比如当前是 11:29 北京时间,它输出的是 03:29) - 这和
date()形成鲜明对比:date('H:i', time())会老老实实输出 11:29 - 常见误判:以为调了
date_default_timezone_set就能“修正”gmdate,其实毫无作用
timestamp 参数含义在两者中一致,但解释方式不同
两个函数都接受可选的 timestamp 参数(默认为 time() 返回值),但关键差异在于:
-
date()把这个timestamp看作“UTC 时间戳”,再转成本地时区显示 -
gmdate()也把它看作“UTC 时间戳”,但不转换,直接以 UTC 时区格式化
换句话说:同一个 timestamp,date 和 gmdate 的差别 = 本地时区偏移量(如 +0800)
- 示例(服务器设为
Asia/Shanghai):echo date('Y-m-d H:i:s', 946684800); // 2000-01-01 00:00:00(本地时间) echo gmdate('Y-m-d H:i:s', 946684800); // 1999-12-31 16:00:00(UTC 时间) - 注意:946684800 是 2000-01-01 00:00:00 UTC 对应的时间戳,所以
gmdate输出的就是那一刻的 UTC 字符串,而date自动加了 +8 小时
Windows 下 date 行为可能异常,但 gmdate 更稳定
PHP 在旧版 Windows 上对本地时区支持较弱,尤其 PHP
-
date()可能无法正确应用时区偏移,导致输出和gmdate一样(都是 UTC 时间) -
gmdate()因为绕过时区逻辑,反而表现更一致 - 所以跨平台项目中,有人倾向统一用
gmdate+ 手动加减秒数(如time() + 3600 * 8)来模拟本地时间,避免环境差异
真正容易被忽略的是:gmdate 不是“带时区的 date”,它是纯 UTC 快照函数。 如果你需要用户本地时间,别试图靠改时区去“修复”gmdate;该用 DateTime 类配合 setTimezone,或者老实用 date 配合正确设置的 date_default_timezone_set。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











