给定日期的下一个工作日(PHP 格式)

2022-08-30 12:47:19

有没有人有一个PHP代码段来计算给定日期的下一个工作日?例如,如何转换 YYYY-MM-DD 才能了解下一个工作日?

示例:对于 03.04.2011 (DD-MM-YYYY),下一个工作日是 04.04.2011。2011 年 4 月 8 日,下一个工作日是 2011 年 4 月 11 日。

这是包含我需要知道的下一个工作日的日期的变量

$cubeTime['time'];

变量包含: 2011-04-01 结果的片段应为: 2011-04-04


答案 1

下一个工作日

这将查找特定日期的下一个工作日(不包括星期六或星期日):

echo date('Y-m-d', strtotime('2011-04-05 +1 Weekday'));

当然,您也可以使用日期变量来执行此操作:

$myDate = '2011-04-05';
echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));

更新:或者,如果您有权访问PHP的DateTime类(很可能):

$date = new DateTime('2018-01-27');
$date->modify('+7 weekday');
echo $date->format('Y-m-d');

想要跳过假期吗?

虽然原来的海报上提到“我不需要考虑假期”,但如果你碰巧想忽略假期,只要记住 - “假期”只是你不想包括的任何日期的数组,并且按国家,地区,公司,个人而有所不同......等。

只需将上述代码放入一个函数中,该函数排除/循环超过您不希望包含的日期。像这样:

$tmpDate = '2015-06-22';
$holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
$i = 1;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));

while (in_array($nextBusinessDay, $holidays)) {
    $i++;
    $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
}

我相信如果你愿意,上面的代码可以简化或缩短。我试图以一种易于理解的方式写它。


答案 2

对于英国假期,您可以使用

https://www.gov.uk/bank-holidays#england-and-wales

ICS 格式数据易于解析。我的建议是...

# $date must be in YYYY-MM-DD format
# You can pass in either an array of holidays in YYYYMMDD format
# OR a URL for a .ics file containing holidays
# this defaults to the UK government holiday data for England and Wales
function addBusinessDays($date,$numDays=1,$holidays='') {
    if ($holidays==='') $holidays = 'https://www.gov.uk/bank-holidays/england-and-wales.ics';

    if (!is_array($holidays)) {
        $ch = curl_init($holidays);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        $ics = curl_exec($ch);
        curl_close($ch);
        $ics = explode("\n",$ics);
        $ics = preg_grep('/^DTSTART;/',$ics);
        $holidays = preg_replace('/^DTSTART;VALUE=DATE:(\\d{4})(\\d{2})(\\d{2}).*/s','$1-$2-$3',$ics);
    }

    $addDay = 0;
    while ($numDays--) {
        while (true) {
            $addDay++;
            $newDate = date('Y-m-d', strtotime("$date +$addDay Days"));
            $newDayOfWeek = date('w', strtotime($newDate));
            if ( $newDayOfWeek>0 && $newDayOfWeek<6 && !in_array($newDate,$holidays)) break;
        }
    }

    return $newDate;
}

推荐