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

如何用PHP获取当年指定月份最后一个周末的起始DateTime?

PHP获取指定月份最后一个周末的起始DateTime

嘿,我来帮你搞定这个需求!要获取当年指定月份最后一个周末的起始DateTime,我们可以分步骤来实现,先理清楚核心逻辑:

从你的例子(2018年3月的起始是23号)来看,这里的周末应该是包含周五、周六、周日的完整周末,且三天都要落在目标月份内。如果当月最后一天的周日跨到了下个月,那我们就取前一周的周五作为起始;如果最后一个周日在当月内,就直接取对应的周五(要是你把周末起始定义为周六,调整下逻辑就行)。

下面是具体的PHP代码实现,我加了详细注释方便你理解:

<?php
/**
 * 获取指定年份、月份最后一个周末的起始DateTime
 * @param int $year 目标年份(如2018)
 * @param int $month 目标月份(1-12)
 * @param string $weekStartDay 周末起始日,默认'Friday',可选'Saturday'
 * @return DateTime|null 返回DateTime对象,参数不合法则返回null
 */
function getLastWeekendStartOfMonth(int $year, int $month, string $weekStartDay = 'Friday'): ?DateTime
{
    // 先验证参数合法性
    if ($month < 1 || $month > 12 || $year < 1970) {
        return null;
    }

    // 获取目标月份的最后一天
    $lastDayOfMonth = DateTime::createFromFormat('Y-m-d', "{$year}-{$month}-01")->modify('last day of this month');
    
    // 定义周末的结束日为周日
    $weekEndDay = 'Sunday';
    // 找到当月最后一个周日的日期
    $lastSundayOfMonth = clone $lastDayOfMonth;
    $lastSundayOfMonth->modify("last {$weekEndDay} of this month");

    // 判断最后一个周日是否在目标月份内
    if ($lastSundayOfMonth->format('m') == $month) {
        // 周日在当月,直接找对应的起始日
        $startDate = clone $lastSundayOfMonth;
        $startDate->modify("last {$weekStartDay}");
    } else {
        // 周日跨到了下月,往前推一周再找起始日
        $startDate = clone $lastDayOfMonth;
        $startDate->modify("-1 week")->modify("last {$weekStartDay}");
    }

    return $startDate;
}

// 测试你的示例:2018年3月的最后一个周末起始日期
$startDate = getLastWeekendStartOfMonth(2018, 3);
echo $startDate->format('d-m-Y'); // 输出 23-03-2018,和你的例子完全一致!

// 再测试2024年3月:2024年3月31日是周日,完整周末都在当月,起始日是29号(周五)
$startDate2024 = getLastWeekendStartOfMonth(2024, 3);
echo $startDate2024->format('d-m-Y'); // 输出 29-03-2024

// 如果需要把起始日定义为周六,只需传入第二个参数
$startDateSat = getLastWeekendStartOfMonth(2018, 3, 'Saturday');
echo $startDateSat->format('d-m-Y'); // 输出 24-03-2018
?>

关键逻辑拆解:

  1. 定位月份最后一天:利用DateTime的modify('last day of this month')方法快速获取,不用手动计算每个月的天数。
  2. 判断完整周末是否在当月:通过检查最后一个周日的月份是否和目标月份一致,来确定是否需要往前推一周。
  3. 灵活适配起始日:支持自定义周末起始日(周五/周六),只需调用函数时传入对应参数即可。

这样的代码既灵活又可靠,能轻松适配不同年份和不同的周末定义~

内容的提问来源于stack exchange,提问作者Lululu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:07