发布于2026-07-09 阅读(0)
扫一扫,手机访问
在日常业务中,合同截止日、审批倒计时、服务生效日这些场景,经常会遇到一个看似简单但其实挺坑的问题:从某个日期倒推N个工作日,结果算出来的日期恰好落在周末或者法定节假日上,那这个结果就完全失去了业务意义。比如,从2022年5月3日(星期二)往前减2天,直接减出来是5月1日(星期日)——但业务上真正想要的,是前一个工作日,也就是4月29日(星期五)。如果再考虑春节、国庆这些法定假日,还得动态判断日期是否在预设的节假日列表里。
那么,在WordPress + ACF的环境下,怎么实现一个既准确又容易维护的方案?下面这套循环校验法,经过多次生产验证,值得收藏。
function get_business_days_before($date_string, $days = 2, $holidays = []) {
$date = new DateTime($date_string);
$count = 0;
while ($count < $days) {
$date->modify('-1 day');
$dayOfWeek = (int)$date->format('w'); // 0=Sunday, 6=Saturday
$isoDate = $date->format('Y-m-d');
// 跳过周末(周日=0,周六=6)和节假日
if ($dayOfWeek === 0 || $dayOfWeek === 6 || in_array($isoDate, $holidays)) {
continue;
}
$count++;
}
return $date->format('j F Y'); // 如:29 April 2022
}
// 使用示例(WordPress + ACF)
$setDate = get_field('div_registry'); // e.g., '2022-05-03'
$holidays = [
'2022-01-01', // 元旦
'2022-10-01', // 国庆
'2022-01-31', // 春节(示例)
];
$cutOff = get_business_days_before($setDate, 2, $holidays);
echo $cutOff; // 输出:29 April 2022
strpos($cutOff, 'Sunday') 这类手段,但WordPress多语言站点会返回“星期日”,而 DateTime::format('w') 返回标准化数字(0–6),这才是跨语言、跨时区都可靠的方案。DateTime::format('Y-m-d') 输出一致,用 in_array() 高效比对。建议把节假日数组存放在配置文件或数据库里,运维更新时改一处就生效。new DateTime($date_string) 默认使用WordPress时区(由 wp_timezone() 控制),和 wp_date() 行为一致,无需额外设置。wp_schedule_event 定期刷新节假日列表——比如对接国家日历API,自动更新法定假日数据。这套方案兼顾了准确性、可读性和可维护性,是生产环境下处理“工作日偏移”的推荐打法。如果你正在做类似的日期计算,直接拿过去用,省心又靠谱。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8