
本文讲解如何将mysql返回的日期字符串(如y-m-d h:i:s)安全转换为指定格式(如d/m/y h:i),解决date_format()函数因参数类型不匹配导致的警告问题。
本文讲解如何将mysql返回的日期字符串(如y-m-d h:i:s)安全转换为指定格式(如d/m/y h:i),解决date_format()函数因参数类型不匹配导致的警告问题。
在使用MySQL查询获取时间字段(如 date_created)时,PHP 默认将其作为字符串(例如 "2024-05-12 14:30:45")返回,而非 DateTime 对象。而 date_format() 函数要求第一个参数必须是实现了 DateTimeInterface 的对象(如 DateTime 或 DateTimeImmutable),直接传入字符串会导致如下错误:
Warning: date_format() expects parameter 1 to be DateTimeInterface, string given
✅ 正确做法是:先将字符串解析为 DateTime 对象,再调用格式化方法。
✅ 推荐写法(简洁可靠)
foreach ($news as $new) {
$formattedDate = date_format(date_create($new['date_created']), 'd/m/Y H:i');
echo "<p>发布日期:{$formattedDate}</p>";
}?
date_create($string)是new DateTime($string)的函数式别名,会自动识别标准日期格式(如Y-m-d H:i:s、Y-m-d等),失败时返回false,建议生产环境添加基础校验:立即学习“PHP免费学习笔记(深入)”;
✅ 增强健壮性的写法(推荐用于正式项目)
foreach ($news as $new) {
$dateObj = date_create($new['date_created']);
if ($dateObj === false) {
$formattedDate = '未知日期';
} else {
$formattedDate = $dateObj->format('d/m/Y H:i');
}
echo "<p>ID: {$new['id']} — 标题: {$new['title']} — 发布于: {$formattedDate}</p>";
}⚠️ 注意事项
- 不要混淆
date_format()(面向对象风格,需DateTime实例)与date()(面向过程风格,接受时间戳); - 若数据库字段为
DATETIME或TIMESTAMP类型,且 PHP 版本 ≥ 8.2,也可考虑在 SQL 层直接格式化(如DATE_FORMAT(date_created, '%d/%m/%Y %H:%i')),但会丧失时区灵活性,且不利于后续逻辑处理; - 更现代的替代方案是使用
DateTimeImmutable提升可维护性与线程安全性:
$date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $new['date_created'])
?? new DateTimeImmutable('now');
echo $date->format('d/m/Y H:i');掌握日期字符串到 DateTime 对象的正确转换,是 PHP 数据展示环节的关键基础能力——既避免运行时错误,也为国际化、时区转换等进阶需求打下坚实基础。



















