date()函数需传入整数秒级时间戳并显式设置时区,如date('y-m-d h:i:s', (int)$ts);毫秒需除1000取整;strtotime()不能用于时间戳转字符串;中文显示推荐映射数组而非locale。

date() 函数怎么用才不出错
直接用 date() 转时间戳是最常用也最容易翻车的方式。它不接受空值、字符串时间、或毫秒级时间戳,只认整数秒级时间戳。
常见错误现象:date(): Invalid date format 或输出 1970-01-01;本质是传了 0、null、"1712345678"(字符串没转)或 1712345678999(毫秒)。
- 务必先用
(int)或intval()强转,比如$ts = (int)$ts; - 毫秒时间戳要除以 1000 再取整:
$sec = (int)($ms_ts / 1000); - 时区必须显式设置,否则依赖服务器默认(常为 UTC),导致本地时间偏差 8 小时:
date_default_timezone_set('Asia/Shanghai'); - 格式字符串里
Y是 4 位年份,y是 2 位;m补零月,n不补零;别写成MM或yyyy—— PHP 不认
示例:date('Y-m-d H:i:s', (int)$timestamp),前提是已设好时区。
strtotime() 能不能反向用来转时间戳
不能。虽然 strtotime() 常被误当作“万能转换器”,但它本质是把**日期字符串解析成时间戳**,不是把时间戳转成字符串。拿时间戳当参数传给它,会触发隐式类型转换,结果不可靠。
立即学习“PHP免费学习笔记(深入)”;
使用场景:只有当你拿到的是类似 "2024-04-05 14:30:00" 这样的字符串,且需要转成时间戳时,才用 strtotime()。
- 传入整数时间戳(如
1712345678)会被当成“公元 1712 年”,返回错误值 - 传入字符串时间但格式模糊(如
"05/04/2024")在不同地区解析顺序不同(美式 vs 中式),结果不一致 - 性能上比
date()多一层解析逻辑,纯时间戳→字符串场景下没必要绕路
一句话:时间戳已有,就别再喂给 strtotime() —— 它不是你的格式化工具。
date() 和 DateTime 类选哪个
简单格式化用 date() 更轻量;涉及时区切换、加减日期、多格式复用,必须用 DateTime 类。
容易踩的坑在于:以为 DateTime 只是“高级版 date()”,其实它默认构造时就绑定当前时区,而 date() 完全依赖全局时区设置。
-
new DateTime('@'.$timestamp)是正确创建方式(@表示 Unix 时间戳),漏掉@会当成字符串解析 - 用
setTimezone()切换时区后,format()输出才生效;不调用则仍按构造时区输出 -
DateTime::createFromFormat()适合解析非标准格式字符串,但和date()无关,别混用 - 性能差异微小,但对象创建有开销;高频循环中格式化同一时间戳,
date()略快
示例:$dt = new DateTime('@1712345678'); $dt->setTimezone(new DateTimeZone('Asia/Shanghai')); echo $dt->format('Y-m-d');
中文星期、月份怎么显示
PHP 原生 date() 不支持中文输出,l(星期全称)、F(月份全称)只返回英文。强行用 str_replace() 替换有隐患——比如 “March” 和 “December” 都含 “ar”,易误替换。
可靠做法是用 strftime() + setlocale(),但注意:strftime() 在 PHP 8.1+ 已废弃,且 Windows 下 locale 名称和 Linux 不同(如 'zh_CN.UTF-8' vs 'Chinese_China.936')。
- 推荐方案:自己维护映射数组,最可控:
$weekdays = ['Sunday'=>'周日', 'Monday'=>'周一', ...]; - 如果必须用系统 locale,先确认是否启用:
var_dump(setlocale(LC_TIME, 'zh_CN.UTF-8'));返回false就失败 -
date()的w返回 0–6(周日到周六),可直接做数组下标:$cn_week = ['周日','周一','周二','周三','周四','周五','周六'][$w];
别依赖环境 locale 做生产环境的中文日期,映射表虽土,但稳。











