php date() 中文乱码主因是字符编码不匹配而非函数错误:需确保文件utf-8无bom、输出前设header('content-type: text/html; charset=utf-8'),避免直接在格式串中写中文;推荐用intldateformatter或数组映射实现稳定本地化。

PHP date() 输出中文乱码
根本原因不是 date() 本身出错,而是它返回纯 ASCII 字符串(如 "Jan"、"Monday"),当你用中文格式字符串(如 "Y年m月d日")却没设置正确字符编码时,PHP 不会自动转义或本地化——它只拼接字面量。乱码实际发生在输出到浏览器或终端时的编码不匹配。
- 确保 PHP 文件本身以 UTF-8 无 BOM 编码保存(编辑器里确认,别信文件名后缀)
- 在输出前加
header('Content-Type: text/html; charset=utf-8');,否则浏览器可能按 GBK 解析 UTF-8 字节 - 避免直接写中文到
date()格式串:错误写法date("Y年m月d日")—— 这个“年”“月”“日”是 PHP 字符串常量,不是函数生成的,若文件编码不对就直接崩 - 更稳妥的做法是用英文格式 + 后续替换:
date('Y-m-d') . '日',或统一用strftime()(需先setlocale())
使用 strftime() 显示中文星期/月份仍乱码
strftime() 依赖系统 locale 设置,不是 PHP 自带功能。Windows 和 Linux 行为差异极大,且中文 locale 名称不统一(zh_CN.UTF-8、Chinese_China.936 都可能),设错就退化成问号或空字符串。
- Linux 下先运行命令
locale -a | grep -i zh查看可用 locale,再用setlocale(LC_TIME, 'zh_CN.UTF-8') - Windows 下通常得用
setlocale(LC_TIME, 'Chinese_China')或'chs',但 PHP 8.1+ 对 Windows locale 支持更严格,建议降级用date()拼接 -
strftime()返回值编码必须和当前脚本一致:如果 locale 是 UTF-8,PHP 文件就得是 UTF-8;如果 locale 是 GBK,文件也得存为 GBK(极不推荐) - 测试是否生效:执行
var_dump(strftime('%A %B'));,输出string(0) ""就说明 locale 设置失败
MySQL 存储日期后用 PHP 输出中文格式显示异常
常见陷阱是把时间字段当字符串直接 echo,比如 $row['created_at'] 是 "2024-05-20 14:30:00",直接插进中文模板里,结果发现“2024-05-20”里的短横线被当成减号或渲染异常——其实是 HTML 或字体问题,不是日期逻辑错。
- 不要直接输出数据库原始时间字符串做界面展示,先过
strtotime()或DateTime构造:例如$dt = new DateTime($row['created_at']); echo $dt->format('Y年m月d日 H:i'); - 注意 MySQL 的
TIMESTAMP和DATETIME在时区处理上不同:TIMESTAMP会自动转为当前时区,DATETIME原样存储,用错会导致显示时间偏移 - 如果页面已有
<meta charset="utf-8">但依然乱码,检查 HTTP 响应头是否被服务器(如 Nginx)覆盖了charset,用浏览器开发者工具的 Network → Response Headers 确认
多语言站点中日期本地化失效
靠 setlocale() 切换语言不靠谱:它是进程级全局状态,多用户并发时可能互相覆盖;而且 locale 不支持同时多个语言实例。
立即学习“PHP免费学习笔记(深入)”;
- 改用
IntlDateFormatter类(需启用 intl 扩展):它线程安全、可实例化、支持 Unicode CLDR 数据,中文显示稳定 - 示例:
$fmt = new IntlDateFormatter('zh_CN', IntlDateFormatter::FULL, IntlDateFormatter::NONE); echo $fmt->format(strtotime('2024-05-20')); - 注意:
intl在部分共享主机上默认关闭,用extension_loaded('intl')先判断,别等上线才发现报错Class 'IntlDateFormatter' not found - 如果无法启用 intl,退而求其次用数组映射:建一个
$weekdays_zh = ['Sunday'=>'周日', 'Monday'=>'周一', ...],配合date('l')输出英文再查表











