如何用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 ?>
关键逻辑拆解:
- 定位月份最后一天:利用
DateTime的modify('last day of this month')方法快速获取,不用手动计算每个月的天数。 - 判断完整周末是否在当月:通过检查最后一个周日的月份是否和目标月份一致,来确定是否需要往前推一周。
- 灵活适配起始日:支持自定义周末起始日(周五/周六),只需调用函数时传入对应参数即可。
这样的代码既灵活又可靠,能轻松适配不同年份和不同的周末定义~
内容的提问来源于stack exchange,提问作者Lululu
相关产品推荐
相关产品推荐

