用 date 和 strtotime 生成日期序列最直接,如生成2026-01-01至2026-03-31每日数组;需注意边界、时区、模板xss防护及excel日期格式化问题。

用 date 和 strtotime 生成日期序列最直接
不需要引入额外类库,原生 PHP 就能搞定。比如要生成从 2026-01-01 到 2026-03-31 的每日日期数组:
-
strtotime支持+1 day、+1 month这类自然语言偏移,比手动加秒更安全 - 注意别用
for ($i = 0; $i 然后 <code>date('Y-m-d', strtotime("2026-01-01 +{$i} day"))—— 大跨度时(如跨月)可能跳过月末最后一天或重复某天 - 推荐写法是“起始日期 → 循环中每次加 1 天 → 判断是否超过结束日期”
示例:
$start = strtotime('2026-01-01');
$end = strtotime('2026-03-31');
$dates = [];
while ($start
<h3>用 <code>DateTime</code> 类做区间迭代更可控</h3>
<p>当需要处理时区、闰年、每月首/末日等边界场景时,<code>DateTime</code> 比 <code>strtotime</code> 更可靠。ThinkPHP5.1 本身不强制依赖它,但 PHP 7.2+ 原生支持,可直接用。</p>
- 避免用
new DateTime('2026-01-01')->modify('+30 days')这种链式调用——modify()会修改原对象,容易在循环中出错 - 正确做法是每次
clone或重新new实例 - 若需按月循环(如生成每月 1 号),用
modify('first day of next month')比硬算天数更稳
示例(按月生成):
$start = new DateTime('2026-01-01');
$end = new DateTime('2026-12-01');
$months = [];
while ($start format('Y-m');
$start = clone $start;
$start->modify('first day of next month');
}
在 ThinkPHP5.1 模板里循环日期要防 XSS 和格式错乱
如果把日期数组传给模板(如 view),直接 {volist name="dates" item="date"}{$date}{/volist} 是可行的,但要注意:
-
{$date}默认不做转义,若$date来自用户输入或拼接字符串,可能触发 XSS —— 即使是日期也建议加|htmlspecialchars - 模板里不要用
date('Y-m-d', $date)这类函数,因为传入的是字符串而非时间戳;传给模板前就该统一格式化好 - 如果日期用于 URL 参数(如
url('report/detail', ['date' => $d])),确保$d是标准格式(如Y-m-d),避免斜杠或冒号被路由解析干扰
导出 Excel 报表时日期字段容易被 Excel 自动识别成数字
用 PhpSpreadsheet 导出含日期列的报表时,常见问题是 Excel 把 2026-08-07 显示成 46567(Excel 内部序列值)。
- 必须显式设置单元格样式为日期类型,不能只靠写字符串
- 写入前用
DateTime::createFromFormat('Y-m-d', $date)->getTimestamp()转成时间戳,再用PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2格式化 - 如果日期带时间(如
2026-08-07 14:30:00),要用FORMAT_DATETIME并配合setCalculatedValue()避免精度丢失
关键代码片段:
$cell = $sheet->getCell('A1');
$cell->setValueExplicit(strtotime('2026-08-07'), \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_NUMERIC);
$cell->getStyle()->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2);
日期循环看着简单,真正踩坑多在边界(如 2 月 29 日)、时区偏移、模板渲染上下文和 Excel 导出格式这四块。别图快用字符串拼接,尤其涉及月份或跨年时,DateTime 的 modify 和 first day of 这类语义化方法才是省调试时间的关键。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











