PHP实现两个日期间按周循环列出选中星期几对应日期
PHP按周循环输出指定星期几日期的修复方案
核心问题说明
原有代码的问题主要有三点:
- 仅手动输出首周和次周的日期,没有循环遍历到结束日期的逻辑
- 表单checkbox的value为固定当前周的具体日期,无法适配任意开始日期的场景
- 接收参数的键名和表单提交的键名不匹配,参数读取错误
第一步:修正前端表单代码
修复了checkbox拼写错误,调整value为星期几标识,适配任意日期范围:
<form action="" method="POST"> <table> <tr> <td style="width:15%;">开始日期</td> <td style="width:15%;"> <input type="text" name="startdate" style="width:95%;height:20px;text-align:center;" placeholder="例:2020-01-01"> </td> <td style="width:15%;">结束日期</td> <td style="width:15%;"> <input type="text" name="enddate" style="width:95%;height:20px;text-align:center;" placeholder="例:2020-12-31"> </td> </tr> <tr> <td><input type="checkbox" class="deneme" name="txtSali[]" value="monday"> 周一</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="tuesday"> 周二</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="wednesday"> 周三</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="thursday"> 周四</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="friday"> 周五</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="saturday"> 周六</td> <td><input type="checkbox" class="deneme" name="txtSali[]" value="sunday"> 周日</td> </tr> <tr> <td colspan="7"><button type="submit">生成日期</button></td> </tr> </table> </form>
第二步:修正后端PHP处理逻辑
新增周循环逻辑,增加日期排序保证输出顺序符合要求:
<?php if (!empty($_POST['startdate']) && !empty($_POST['enddate']) && !empty($_POST['txtSali'])) { // 转换开始结束日期为时间戳,可自行加异常校验处理非法日期格式 $startTimestamp = strtotime($_POST['startdate']); $endTimestamp = strtotime($_POST['enddate']); $dateList = []; // 遍历所有选中的星期几 foreach ($_POST['txtSali'] as $weekDay) { // 计算大于等于开始日期的第一个对应星期几的时间戳 $currentDate = strtotime("next {$weekDay}", $startTimestamp - 86400); // 按周循环直到超过结束日期 while ($currentDate <= $endTimestamp) { $dateList[] = $currentDate; $currentDate = strtotime("+1 week", $currentDate); } } // 按日期升序排序,保证输出顺序符合示例要求 sort($dateList); // 输出结果 foreach ($dateList as $item) { echo date("d.m.Y D", $item) . "<br>"; } } ?>
效果验证
假设选中周一、周五,开始日期填2020-01-01,结束日期填2020-01-31,输出结果如下:
06.01.2020 Mon 10.01.2020 Fri 13.01.2020 Mon 17.01.2020 Fri 20.01.2020 Mon 24.01.2020 Fri 27.01.2020 Mon 31.01.2020 Fri
内容的提问来源于stack exchange,提问作者Murat özkan
相关产品推荐
相关产品推荐

