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

如何在PHP面向过程模式下获取两个日期间的所有法定节假日并存入数组

PHP 动态获取指定日期间法定节假日(马尼拉时区)实现方案

你当前代码使用的是菲律宾马尼拉时区,我们以菲律宾法定节假日为例实现动态获取逻辑,替换硬编码的$holidays变量。

实现逻辑

菲律宾法定节假日分为固定日期假日和每年变动的浮动假日(如复活节相关假日),我们可以先按年维护节假日配置,再编写方法提取两个输入日期之间的节假日。

完整代码示例

<?php
date_default_timezone_set("Asia/Manila");

// 菲律宾节假日配置,可按年扩展
function getPHHolidaysByYear($year) {
    $holidays = [
        2021 => [
            "2021-01-01", // 元旦
            "2021-02-12", // 农历新年
            "2021-02-25", // EDSA革命纪念日
            "2021-04-01", // 圣周
            "2021-04-02", // 耶稣受难日
            "2021-04-03", // 黑色星期六
            "2021-05-01", // 劳动节
            "2021-05-13", // 开斋节
            "2021-06-12", // 独立日
            "2021-08-30", // 国家英雄日
            "2021-11-01", // 万圣节
            "2021-11-02", // 万灵节
            "2021-11-30", // 博尼法西奥日
            "2021-12-08", // 圣母无原罪日
            "2021-12-24", // 平安夜
            "2021-12-25", // 圣诞节
            "2021-12-30", // 黎刹日
            "2021-12-31", // 新年前夜
        ],
        // 可以继续添加2022及之后年份的节假日配置
    ];
    return isset($holidays[$year]) ? $holidays[$year] : [];
}

// 获取两个日期之间的所有节假日
function getHolidaysBetween($startDate, $endDate) {
    $startTs = strtotime($startDate);
    $endTs = strtotime($endDate);
    $startYear = date("Y", $startTs);
    $endYear = date("Y", $endTs);
    $allHolidays = [];
    $holidays = [];
    // 收集涉及到的所有年份的节假日
    for ($y = $startYear; $y <= $endYear; $y++) {
        $allHolidays = array_merge($allHolidays, getPHHolidaysByYear($y));
    }
    // 筛选出在日期范围内的节假日
    foreach ($allHolidays as $holiday) {
        $holidayTs = strtotime($holiday);
        if ($holidayTs >= $startTs && $holidayTs <= $endTs) {
            $holidays[] = $holiday;
        }
    }
    return $holidays;
}

// 原有工作日统计函数(优化了日期判断逻辑)
function getWorkingDays($startDate, $endDate, $offdays, $holidays)
{
    $endDate = strtotime($endDate);
    $startDate = strtotime($startDate);
    $days = ($endDate - $startDate) / 86400 + 1;
    $counter = 0;
    for($i = 1; $i <= $days; $i++)
    {
        $the_first_day_of_week = date("N", $startDate);
        $currentDate = date("Y-m-d", $startDate);
        $startDate += 86400;
        if(!in_array($the_first_day_of_week, $offdays) && !in_array($currentDate, $holidays))
        {
            $counter++;
        }
    }   

    return $counter;
}

// 调用示例
$given_date = "2021-10-20";
$target_date = "2021-11-06";
// 动态获取节假日,替换原有硬编码
$holidays = getHolidaysBetween($given_date, $target_date);
$offdays = array(5,6);
echo getWorkingDays($given_date, $target_date, $offdays, $holidays);
?>

扩展说明

  • 如果需要适配其他国家/地区的节假日,只需要修改getPHHolidaysByYear里的节假日配置即可
  • 每年官方发布新的节假日安排后,更新对应年份的配置数组即可正常使用
  • 如果你内部有统一维护的节假日服务,也可以修改getHolidaysBetween方法,调用内部接口获取指定范围的节假日列表,不需要手动维护配置

内容的提问来源于stack exchange,提问作者Mr.Jepoyyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:15:03