📌  相关文章
📜  PHP |两个日期之间的工作日数(1)

📅  最后修改于: 2023-12-03 14:45:19.924000             🧑  作者: Mango

PHP | 两个日期之间的工作日数

在实际开发中,往往需要计算两个日期之间的工作日数,而不是简单地计算日期差。在 PHP 中,我们可以借助 DateTime 类和 DateInterval 类来计算两个日期之间的工作日数。

计算两个日期之间的天数

在计算工作日数之前,我们需要先计算两个日期之间的天数。我们可以使用 DateTime 类的 diff 方法计算两个日期之间的时间间隔,然后调用 DateInterval 类的 days 属性获取天数。下面是一个示例代码:

$datetime1 = new DateTime('2022-01-01');
$datetime2 = new DateTime('2022-01-10');
$interval = $datetime1->diff($datetime2);
echo $interval->days; // 输出:9

上述代码中,我们创建了两个 DateTime 对象分别表示 2022 年 1 月 1 日和 2022 年 1 月 10 日,然后通过 diff 方法计算它们之间的时间间隔。最后,我们通过调用 DateInterval 对象的 days 属性获取天数。

排除周末和节假日

要计算两个日期之间的工作日数,我们需要排除周末和节假日。一个常见的做法是将周六和周日定义为非工作日,然后将法定节假日也纳入非工作日范畴。下面是一个示例代码:

function getWorkingDays($startDate, $endDate, $holidays = array()) {
    $startDate = new DateTime($startDate);
    $endDate = new DateTime($endDate);
    $interval = new DateInterval('P1D');
    $periods = new DatePeriod($startDate, $interval, $endDate->modify('+1 day'));
    $days = 0;
    foreach($periods as $period) {
        $dayOfWeek = $period->format('N');
        if($dayOfWeek < 6 && !in_array($period->format('Y-m-d'), $holidays)) {
            $days++;
        }
    }
    return $days;
}

上述代码中,我们定义了一个名为 getWorkingDays 的函数,该函数接受三个参数:起始日期、结束日期和节假日数组。我们首先将起始日期和结束日期转换成 DateTime 对象,然后使用 DateInterval 类来表示一个时间间隔。我们还使用 DatePeriod 类来遍历起始日期和结束日期之间的所有日期,并逐一判断每个日期是否为工作日。最后,我们返回工作日数量。

测试

我们可以使用以下代码来测试 getWorkingDays 函数:

$startDate = '2022-01-01';
$endDate = '2022-01-10';
$holidays = array('2022-01-01', '2022-01-02', '2022-01-03', '2022-01-09', '2022-01-10');
echo getWorkingDays($startDate, $endDate, $holidays); // 输出:4

上述代码中,我们定义了起始日期为 2022 年 1 月 1 日,结束日期为 2022 年 1 月 10 日,节假日包括 2022 年 1 月 1 日、2 日、3 日、9 日和 10 日。最后,我们调用 getWorkingDays 函数来计算两个日期之间的工作日数,输出结果为 4。

总结

在 PHP 中计算两个日期之间的工作日数,我们可以先计算两个日期之间的天数,然后排除周末和节假日。具体实现可以借助 DateTime 类和 DateInterval 类来实现。