如何使用PHP计算两个日期之间包含的1月月份数量
PHP计算两个日期区间内包含的1月数量
嘿,这个需求我之前做项目的时候刚好遇到过,用PHP的DateTime类就能很优雅地解决,我给你分享一下思路和具体代码实现吧!
核心思路
我们的目标是统计两个日期之间所有包含至少一天在区间内的1月数量。核心逻辑很简单:
- 先确定起始日期到结束日期覆盖的所有年份
- 对每一年,检查该年的1月是否和目标日期区间有重叠
- 每有一个符合条件的1月,计数就加1
这种方式既不用遍历每一天(效率更高),又能准确覆盖所有边界情况。
代码实现
下面是封装好的函数,直接就能用:
function countJanuaryMonths(string $startDateStr, string $endDateStr): int { // 把日期字符串转成DateTime对象,方便后续处理 $start = new DateTime($startDateStr); $end = new DateTime($endDateStr); // 处理用户可能传入的起始日期晚于结束日期的情况 if ($start > $end) { [$start, $end] = [$end, $start]; } $count = 0; $startYear = (int)$start->format('Y'); $endYear = (int)$end->format('Y'); // 遍历覆盖的每一年 for ($year = $startYear; $year <= $endYear; $year++) { // 创建当前年份1月的第一天和最后一天 $januaryStart = new DateTime("$year-01-01"); $januaryEnd = new DateTime("$year-01-31"); // 判断当前1月是否与目标区间有重叠 // 只要1月的最后一天 >= 起始日期,且1月的第一天 <= 结束日期,就算有重叠 if ($januaryEnd >= $start && $januaryStart <= $end) { $count++; } } return $count; }
测试示例
用你给出的例子测试一下:
// 起始日期2016-11-14,结束日期2018-01-01 echo countJanuaryMonths('2016-11-14', '2018-01-01'); // 输出:2,完全符合预期
再给几个边界情况的测试,确保函数靠谱:
- 测试1:区间完全包含一个1月 →
countJanuaryMonths('2020-01-15', '2020-02-20')→ 输出:1 - 测试2:区间完全避开1月 →
countJanuaryMonths('2021-02-01', '2021-12-31')→ 输出:0 - 测试3:跨多年的区间 →
countJanuaryMonths('2019-12-30', '2022-01-05')→ 输出:3(包含2020、2021、2022年的1月)
为什么用DateTime?
手动计算日期很容易踩坑,比如闰年的2月、不同月份的天数差异,而DateTime类会帮我们自动处理这些细节,代码更简洁,也不容易出错。
内容的提问来源于stack exchange,提问作者kishan prasad
相关产品推荐
相关产品推荐

