为了账号安全,请及时绑定邮箱和手机立即绑定

yii2 如何计算日期之间的天数,不包括周末和节假日

yii2 如何计算日期之间的天数,不包括周末和节假日

PHP
斯蒂芬大帝 2022-07-16 18:26:36
好的,首先,在你们中的一些人可能把这个问题变成一个重复的问题之前。我经历了许多与我的问题相关的问题。但似乎这些问题无法解决我的问题。我想查找 2 个日期之间的天数,不包括周末和节假日。我经历过的问题声明了数组中的变量$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();所以,我尝试过使用一些值初始化的假期。就我而言,我想$holiday=array()用另一个数据库表中的数据替换它。有没有最好的方法呢?
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

使用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


查看完整回答
反对 回复 2022-07-16
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信