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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:16