如何用PHP获取3个未来日期并生成显示星期与日期的列表?
在线商城日期列表问题及解决方案
我想要为自己的在线商城创建一个表格,列出3个未来日期的星期名称和日期。尝试了一段PHP代码,但无法正常运行,代码如下:
function week_from_monday($date) { // Assuming $date is in format DD-MM-YYYY list($day, $month, $year) = explode("-", $_REQUEST["date"]); // Get the weekday of the given date $wkday = date('l',mktime('0','0','0', $month, $day, $year)); switch($wkday) { case 'Monday': $numDaysToMon = 0; break; case 'Tuesday': $numDaysToMon = 1; break; case 'Wednesday': $numDaysToMon = 2; break; case 'Thursday': $numDaysToMon = 3; break; case 'Friday': $numDaysToMon = 4; break; case 'Saturday': $numDaysToMon = 5; break; case 'Sunday': $numDaysToMon = 6; break; } // Timestamp of the monday for that week $monday = mktime('0','0','0', $month, $day-$numDaysToMon, $year); $seconds_in_a_day = 86400; // Get date for 7 days from Monday (inclusive) for($i=0; $i<7; $i++) { $dates[$i] = date('Y-m-d',$monday+($seconds_in_a_day*$i)); } return $dates; } $ddate = date('Y-m-d'); $date = new DateTime($ddate); $week = $date->format("W"); $week_number = $week; $year = date('Y'); for($day=5; $day<=30; $day++) { echo date('m/d/Y', strtotime($year."W".$week_number.$day))."\n"; }
期望的输出格式如下:
今日:周日
周一 30
周二 31
周三 1
问题分析
原代码存在几个核心问题:
- 函数
week_from_monday定义了参数$date却未使用,错误直接读取$_REQUEST全局变量,导致函数复用性差且逻辑混乱 - 函数假设输入日期格式为
DD-MM-YYYY,但主代码中使用的是Y-m-d格式,格式不匹配会导致日期解析错误 - 主循环中
for($day=5; $day<=30; $day++)逻辑错误,strtotime($year."W".$week_number.$day)中的$day参数应为1-7(代表周几),而非5到30,这会生成大量无效日期 - 未按照期望格式输出星期名称和日期日份,仅打印了完整日期
修正后的代码
最简实现版本
直接生成今日及未来3天的星期与日期:
<?php // 获取今日日期对象 $today = new DateTime(); // 输出今日星期 echo "今日:" . $today->format("l") . "\n"; // 循环生成未来3天的日期 for ($i = 1; $i <= 3; $i++) { // 克隆今日对象并修改为第i天后的日期 $futureDate = (clone $today)->modify("+$i day"); // 输出星期全称和日期日份 echo $futureDate->format("l j") . "\n"; } ?>
可复用函数版本
如果需要更灵活的配置(比如指定起始日期、生成数量),可以使用封装函数:
<?php /** * 生成指定日期之后N个日期的星期名称和日份 * @param DateTime $startDate 起始日期 * @param int $count 要生成的日期数量 * @return array 包含星期和日份的数组 */ function getFutureDatesWithWeekday(DateTime $startDate, int $count): array { $dates = []; for ($i = 1; $i <= $count; $i++) { $date = (clone $startDate)->modify("+$i day"); $dates[] = [ 'weekday' => $date->format("l"), 'day' => $date->format("j") ]; } return $dates; } // 使用示例 $today = new DateTime(); echo "今日:" . $today->format("l") . "\n"; // 获取未来3天的日期信息 $futureDates = getFutureDatesWithWeekday($today, 3); // 循环输出 foreach ($futureDates as $dateInfo) { echo $dateInfo['weekday'] . " " . $dateInfo['day'] . "\n"; } ?>
输出示例(假设今日为周日)
今日:周日
周一 30
周二 31
周三 1
内容的提问来源于stack exchange,提问作者Mehran Pourjenabi
相关产品推荐
相关产品推荐

