date() 函数不接受 null,传入时 PHP 将其转为 0,输出 1970-01-01;实际中常因数据库 NULL 或空字符串触发警告,须前置判空(如 is_null() 或 empty()),不可依赖函数自身容错。

date() 函数遇到 null 会报 Warning 并返回 false
date() 本身不接受 null 作为参数,传入时 PHP 会尝试把它转成整数(即 0),结果输出的是 Unix 纪元时间(1970-01-01)——但这只是表象;更常见的情况是,你从数据库或 API 拿到的日期字段为 null,直接塞给 date() 就触发 Warning: date(): Invalid date format 或静默出错。
根本原因是:date() 只处理时间戳(int),不处理 null、空字符串、false 这类“伪空”值。
- 必须在调用前做空值判断,不能依赖
date()自行容错 - 数据库里
NULL字段读出来通常是 PHP 的null,但有时也会是空字符串(尤其用了COALESCE或 ORM 自动转换) - 用
strtotime()转字符串再喂给date()更危险:传入null或空串时,strtotime()返回false,而date()把false当0处理,照样输出 1970 年
推荐做法:用三元运算 + is_null() 或 empty() 预检
最轻量、最可控的方式是在调用 date() 前兜底。别图省事写成 date('Y-m-d', $timestamp ?: time())——这会把 0、false、空字符串全当成“空”,误伤合法的 1970 时间。
区分场景选判断方式:
立即学习“PHP免费学习笔记(深入)”;
- 只认严格
null:用is_null($date)或$date === null - 兼容
null/ 空字符串 /false(常见于表单输入):用empty($date),但注意它也会把"0"当空 - 稳妥处理时间戳字段(比如 MySQL
DATETIME映射):优先检查是否为数字且 > 0,例如is_int($ts) && $ts > 0
示例:
echo $created_at === null ? '-' : date('Y-m-d', $created_at);
或者封装成小函数:
function safe_date($timestamp, $format = 'Y-m-d') {
return $timestamp !== null && is_numeric($timestamp) && (int)$timestamp > 0
? date($format, (int)$timestamp)
: '-';
}
DateTime 类能自动过滤 null 吗?不能,但错误更明确
DateTime 构造函数对 null 的行为比 date() 更“诚实”:传入 null 会直接抛出 Exception: DateTime::__construct(): Failed to parse time string (null),而不是默默返回错误时间。
这意味着你必须显式处理:
- 用 try/catch 包裹构造过程(适合不确定来源的字符串日期)
- 仍需先判断是否为
null,再决定创建实例——否则异常打断流程 - 如果已有时间戳(int),
DateTime不接受纯数字,得先用DateTime::setTimestamp(),而该方法同样不接受null
正确姿势:
$dt = $created_at === null ? null : (new DateTime())->setTimestamp($created_at);
echo $dt ? $dt->format('Y-m-d') : '-';
ORM 或数据库查询层就该过滤空值
与其在模板或逻辑层反复判空,不如在数据取出时就归一化。例如 Laravel Eloquent 中可定义访问器:
protected function getCreatedAtAttribute($value) {
return $value ? date('Y-m-d', strtotime($value)) : null;
}
或者在查询时用 COALESCE(created_at, '1970-01-01')(慎用,会污染语义);更推荐用 SELECT ..., IFNULL(created_at, '') as created_at,让空值以空字符串到达 PHP 层,再统一按 empty() 判断。
关键点:空值处理层级越靠前,后续代码越干净;但要注意——前端展示的“-”或“未设置”,和业务逻辑中需要的 null 语义不能混为一谈。显示层可以兜底,计算层必须明确知道哪个是真空、哪个是默认值。



















