PHP处理JSON时间需“进得去、出得来、看得懂”:编码时用DateTime对象自动转ISO 8601字符串,解码后手动new DateTime()还原,调试加JSON_PRETTY_PRINT等选项并校验错误。

PHP处理JSON里的时间,核心是“进得去、出得来、看得懂”——编码时把时间转成标准字符串,解码后能还原为可操作的DateTime对象,前端或日志里显示也清晰。不用硬拼字符串,也不靠正则猜格式。
编码前:统一转成ISO 8601标准字符串
json_encode()本身不识别时间语义,它只认PHP原生类型。直接传入日期字符串(如"2026-08-31 13:19")会原样输出,但缺乏时区信息,容易在跨系统解析时出错。
- 推荐做法:用
DateTime对象承载时间,再让json_encode()自动转成ISO格式 - 例如:
$data = ['updated_at' => new DateTime('2026-08-31 13:19:00')]; echo json_encode($data);→ 输出{"updated_at":"2026-08-31T13:19:00+08:00"} - 若原始是时间戳,先转对象:
new DateTime('@'. $timestamp),再format或直接encode - 需要自定义格式(如“2026年08月31日”)?必须先
->format()成字符串,再塞进数组——此时它就只是普通字符串,不再具备时间运算能力
解码后:字符串要主动转回DateTime对象
从JSON解出来的日期字段永远是字符串,PHP不会自动帮你升级成对象。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 用
json_decode($json, true)得到关联数组后,对时间字段调用new DateTime($str) - 支持常见格式:
"2026-08-31T13:19:00+08:00"、"2026-08-31 13:19:00"、"1756646340"(时间戳)都能识别 - 如果格式非常规(如
"/Date(1756646340000)/"),先清洗再构造:new DateTime('@'. substr($str, 6, -2) / 1000) - 建议封装一个
parseDate($value)函数,内部判断类型并返回DateTime,避免到处写重复逻辑
调试与兼容:加选项让JSON更友好
开发阶段多加两个参数,省去很多排查时间。
立即学习“PHP免费学习笔记(深入)”;
- 加
JSON_PRETTY_PRINT:换行缩进,一眼看清结构 - 加
JSON_UNESCAPED_UNICODE:中文不转\uXXXX,时间描述带“年月日”也正常显示 - 加
JSON_NUMERIC_CHECK:防止数字被当成字符串(比如"1623456789"本意是时间戳,结果变成字符串) - 完整示例:
json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
错误预防:别让时间毁掉整个JSON
时间字段出错常导致json_encode()返回false,但错误不明显。
- 每次encode后检查:
if ($json === false) { throw new Exception('JSON编码失败:' . json_last_error_msg()); } - 特别注意:DateTime对象若构造失败(如传入
"2026-02-30"),后续encode也会失败 - 数据库读出的时间字段为空或NULL?提前过滤或设默认值,避免
null混入关键时间字段


















