Php yii2如何计算日期之间的天数(周末和假日除外)

Php yii2如何计算日期之间的天数(周末和假日除外),php,yii2,Php,Yii2,好的,首先,在你们中的一些人把这个问题变成一个重复的问题之前。我已经经历了许多与我的问题相关的问题。但这些问题似乎无法解决我的问题。我想找出两个日期之间的天数,不包括周末和节假日。我遇到的问题是在数组中声明变量$holiday,并初始化该数组中的值 下面是我在LeaveapplicationController.php中查找不包括周末的天数的代码 $date1 = $model->startDate; $date2 = $model->endDate;

好的,首先,在你们中的一些人把这个问题变成一个重复的问题之前。我已经经历了许多与我的问题相关的问题。但这些问题似乎无法解决我的问题。我想找出两个日期之间的天数,不包括周末和节假日。我遇到的问题是在数组中声明变量
$holiday
,并初始化该数组中的值

下面是我在
LeaveapplicationController.php
中查找不包括周末的天数的代码

$date1 = $model->startDate;
        $date2 = $model->endDate;

        $date1 = strtotime($date1);
        $date2 = strtotime($date2);


        //Initialized public holiday
        $holidays = array("2020-01-21", "2020-01-22", "2020-01-23");

        $days = ($date2 - $date1)/86400 + 1;

        $fullWeek = floor($days/7);
        $remainDay = fmod($days,7);

        $firstDay = date("N", $date1);
        $lastDay = date("N", $date2);

        if($firstDay <= $lastDay){
            if($firstDay <= 6 && 6 <= $lastDay) $remainDay--;
            if($firstDay <= 7 && 7 <= $lastDay) $remainDay--;
        }
        else 
        {
            if($firstDay == 7){
                $remainDay--;

                if($lastDay == 6){
                    $remainDay--;
                }
            }
            else{
                $remainDay -= 2;
            }
        }
        $workDay = $fullWeek * 5;
        if($remainDay > 0)
        {
            $workDay += $remainDay;
        }
        foreach($holidays as $holiday){
            $timeStamp = strtotime($holiday);
            if($date1 <= $timeStamp && $timeStamp <= $date2 && date("N", $timeStamp) != 6 && date("N", $timeStamp) != 7)
            $workDay--;
        }
        $model->no_of_days=$workDay;
        $model->save();
$date1=$model->startDate;
$date2=$model->endDate;
$date1=strottime($date1);
$date2=标准时间($date2);
//公众假期
$holidays=数组(“2020-01-21”、“2020-01-22”、“2020-01-23”);
$days=($date2-$date1)/86400+1;
$fullWeek=最低限额($days/7);
$remainDay=fmod($7天);
$firstDay=日期(“N”,$date1);
$lastDay=日期(“N”,$date2);

如果($firstDay使用
DateTime

$start = new \DateTime($model->startDate); //2020-01-01
$end = new \DateTime($model->endDate); //2020-01-31
$endDate = $end->format('Y-m-d');
$interval = new \DateInterval('P1D');
$end->add($interval);
$period = new \DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    $allDates[] = [
        'date' => $date->format('Y-m-d'),
        'dayNo' => $date->format('N'),
    ];
}

//Initialized public holiday
 $holidays = HolidayModelName::find()
    ->select('date')
    ->where(['between', 'date', $start->format('Y-m-d'), $endDate])
    ->indexBy('date')
    ->column();

$workDay = 0;

foreach ($allDates as $value) {
    $isWeekOff = $value['dayNo'] == 6 || $value['dayNo'] == 7;

    if (!$isWeekOff && !isset($holidays[$value['date']])) {
        $workDay++;
    }
}

// Result : 20 Work Days

首先查找
开始日期
结束日期
之间的假日。您需要遍历两个日期之间的每个日期,以排除
假日和周末
中的日期,然后计算天数。@Inaseskull例如,我已经遍历了所有日期,并将它们放入数据库中的公共假日表中。我如何检索这些数据以将其输入o
LeaveapplicationController.php
?@InsaneSkull我已经编辑了我的问题,以使我的问题更清晰。我了解您的整个情况。我将在几个小时内回答您的问题。请注意:
$days=($date2-$date1)/86400+1;
一天并不总是86400秒:根据服务器所处的区域设置,有夏时制,一年中的一天长达25小时,一天只有23小时。根据您的回答,您在
$start
$end
中初始化了日期。但是我的
$date1
$date2
是从da开始的tabase.如何从数据库检索日期?@Aech
$start=new\DateTime($model->startDate);
编辑了答案为什么在
$end->add($interval);
这是对未定义函数app\controllers\add()的错误
调用
@Aech,因为您没有像
$end=new\datetime($model->endDate);
这样的
$end=new\datetime($model->startDate);$date2=new\datetime($model->endDate);$interval=new\DateInterval($P1D)这样初始化它;$date2=添加($interval);$period=新建\DatePeriod($date1,$interval,$date2);