空白天错误源于strtotime()返回false导致date()输出空字符串,进而引发include()文件名为空的报错;常见原因包括日期格式非法、循环变量失效或未校验strtotime结果有效性。

空白天不是日期本身的问题,而是循环逻辑没覆盖到边界或格式转换出错导致的 date() 返回空字符串,进而被 include() 或模板渲染当成空文件名报错。
为什么循环两个日期会出空白天
常见原因是用 strtotime() 加减天数时,起始或结束日期格式非法(如含空格、时区偏移、非标准分隔符),或循环变量在某次迭代后变成 false,再传给 date() 就返回空字符串。ThinkPHP 在加载模板或解析路径时若拿到空字符串,就会触发 include(): Filename cannot be empty 错误。
-
strtotime("2026-08-06 ")尾部有空格 → 返回false -
date("Y-m-d", false)→ 返回空字符串,不是错误,但后续调用会崩 - 循环中用
$i++累加天数,但没校验strtotime($start . " + $i days")是否有效 - 结束条件写成
$date ,而 <code>$date是字符串,比较失效(如 "2026-08-06"
用 DateTime + DatePeriod 替代手动 strtotime 循环
避免字符串拼接和时间戳转换陷阱,直接用 PHP 原生日期类生成序列。注意 DatePeriod 默认不包含结束日期,要手动补一天。
- 起始日期必须是
DateTime实例,不能是字符串 - 间隔用
DateInterval::createFromDateString("1 day"),比硬写"P1D"更直观 - 结束日期要设为
$end->modify("+1 day"),否则最后一天拿不到 - 循环体内直接用
$date->format("Y-m-d"),不会为空
$start = new DateTime("2026-08-01");
$end = new DateTime("2026-08-05");
$end->modify("+1 day"); // 补一天,让 DatePeriod 包含 08-05
$interval = DateInterval::createFromDateString("1 day");
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
echo $date->format("Y-m-d") . "\n"; // 输出:2026-08-01 到 2026-08-05,无空值
}
如果必须用 strtotime 循环,务必加有效性校验
不要假设每次 strtotime() 都成功,尤其在批量处理用户输入的日期时。
立即学习“PHP免费学习笔记(深入)”;
- 每次计算后立刻用
is_int()检查返回值,false就跳过或抛异常 - 避免把
date("Y-m-d", ...)结果直接当路径拼接,先判断非空 - 别用
$date = date("Y-m-d", strtotime(...))一行写法,拆开便于调试
$start_ts = strtotime("2026-08-01");
$end_ts = strtotime("2026-08-05");
if ($start_ts === false || $end_ts === false) {
throw new \Exception("日期格式错误");
}
for ($ts = $start_ts; $ts <= $end_ts; $ts += 86400) {
$date_str = date("Y-m-d", $ts);
if (!$date_str) continue; // 防空
// 后续逻辑,比如写入数据库或渲染模板
}
ThinkPHP 模板里出现空白天的典型场景
不是循环逻辑问题,而是你把一个可能为空的变量直接当模板名用了,比如 include($date_var) 或 fetch($date_var)。TP5.1 的 fetch() 不校验参数,空字符串就真去 include 空文件。
- 检查控制器里是否写了类似
$this->fetch($some_date_field),而该字段数据库里是 NULL 或空字符串 - 模板中用了
{include file="$dateVar"},且$dateVar未初始化或为空 - 用
config()动态读取模板路径时,配置项缺失导致返回空
最稳妥的做法:所有传给 fetch() 或 include 的变量,前面加一层 !empty($var) && is_string($var) 判断,宁可 fallback 到默认模板,也不要让它崩。



















