应使用 date_default_timezone_set('Asia/Shanghai') 设置时区,并优先采用 DateTime 类替代 date() 函数,避免硬编码时间偏移、混淆格式符及字符串与时间戳类型。

date() 函数输出时间总不对,时区没设对
PHP 的 date() 默认用系统时区,但多数服务器在 UTC,而你期望的是北京时间(Asia/Shanghai),结果差 8 小时是常态。别急着改服务器配置,PHP 层就能解决。
- 用
date_default_timezone_set('Asia/Shanghai')在脚本开头设好,比改php.ini更灵活、更安全 - 避免在函数里硬写
+8偏移,比如date('Y-m-d H:i:s', time() + 28800)—— 夏令时、跨年、时区切换全会出错 - 检查是否被框架或 Composer 包悄悄重置过时区,可在调用
date()前加echo date_default_timezone_get();确认
格式字符串里这些字符容易记混
date() 的格式符看着简单,但几个高频符号实际行为和直觉相反:
-
Y是 4 位年份(如2024),y才是 2 位(24)—— 写成y却想输出 2024,结果永远少两位 -
m是带前导零的月(01–12),n才是无前导零(1–12);同理dvsj也一样 - 星期几:
D输出缩写(Mon),N输出数字(1表示周一),w也是数字但周日为0—— 比较判断时用N更符合逻辑习惯
用 time() 当参数不如用 DateTime 类
直接传 time() 给 date() 看似方便,但一涉及加减、时区转换、日期计算,立刻变脆弱:
- 比如“昨天此时”,
date('Y-m-d H:i:s', time() - 86400)在跨月/闰秒/夏令时切换日会错,new DateTime('-1 day')自动处理边界 -
date()只能格式化,不能解析字符串;要从'2024-03-15'算出下周三,硬算 timestamp 容易溢出或逻辑绕晕 - PHP 5.2+ 推荐统一用
DateTime+format(),兼容性够,可读性高:(new DateTime())->modify('+2 hours')->format('Y-m-d H:i:s')
注意 date() 返回的是字符串,不是时间戳
新手常把 date() 结果当时间戳继续参与运算,比如 $t = date('U'); $next = $t + 3600; —— 这里 $t 是字符串 "1710502345",PHP 会隐式转整型,看似可行,但一旦格式含非数字字符(如 date('Y-m-d')),后续加减就变成 0 或报错。
立即学习“PHP免费学习笔记(深入)”;
- 要时间戳,直接用
time()或(new DateTime())->getTimestamp() - 要格式化,只用
date()或DateTime::format(),别混着用 - 调试时用
var_dump($var)看类型,比echo更早发现问题
时区设置和类型混淆这两点,线上出问题最多,而且错误现象不明显——时间差几小时、某天突然错一天、测试环境对生产环境错,根源往往就在这两处。



















