
本文介绍如何将使用 dateperiod 生成的年月下拉菜单(如 06.2014、07.2014…)从升序(旧→新)改为降序(新→旧),并修正已弃用的 strftime() 调用,确保代码符合现代 php 最佳实践。
本文介绍如何将使用 dateperiod 生成的年月下拉菜单(如 06.2014、07.2014…)从升序(旧→新)改为降序(新→旧),并修正已弃用的 strftime() 调用,确保代码符合现代 php 最佳实践。
在 PHP 中,DatePeriod 默认按时间正向迭代(即从 $start 到 $end 逐月递增),因此生成的
以下是优化后的完整实现:
<?php $start = new DateTime('2014-06-01');
$end = new DateTime(date('Y-m-d'));
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
$select_mois = '<select name="select_mois" id="select_mois">';
// ✅ 关键步骤:将 DatePeriod 转为索引数组,再反转
$dates = array_reverse(iterator_to_array($period));
foreach ($dates as $dt) {
$value = $dt->format('m-Y'); // 如 '04-2024'
$label = $dt->format('m.Y'); // 如 '04.2024'(安全、高效、无弃用警告)
$select_mois .= "<option value='\"{$value}\"'>{$label}</option>";
}
$select_mois .= '';
echo $select_mois;
?>
? 注意事项与最佳实践:
- iterator_to_array($period) 是必需中间步骤:DatePeriod 实现了 Iterator 接口,但不支持 array_reverse() 直接操作,必须先转为数组;
- 已弃用 strftime():PHP 8.1+ 中 strftime() 标记为 deprecated,且其依赖系统 locale 和 U 时间戳($dt->format('U') 在夏令时或跨时区场景下可能出错),应统一使用 DateTime::format();
- format('m.Y') 输出格式稳定、线程安全、无需 locale 配置,推荐替代所有 strftime('%m.%Y', ...);
- 若需包含 $end 日期(即“闭区间”),可将 DatePeriod 构造调整为:
$end->modify('+1 month'); // 向后延展一个周期,确保末月被包含 $period = new DatePeriod($start, $interval, $end);
✅ 总结:反转逻辑本质是「正向生成 → 数组化 → 反转 → 渲染」,配合 format() 替代 strftime(),即可获得语义清晰、向后兼容、符合 PSR-12 规范的专业级下拉菜单代码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











