You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:41:07