如何在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
相关产品推荐
相关产品推荐

