Php 获取给定月份的工作日数

Php 获取给定月份的工作日数,php,calendar,days,weekday,weekend,Php,Calendar,Days,Weekday,Weekend,我想计算给定月份和年份中的工作日数。工作日是指周一至周五。我该怎么做?一些基本代码: $month = 12; $weekdays = array(); $d = 1; do { $mk = mktime(0, 0, 0, $month, $d, date("Y")); @$weekdays[date("w", $mk)]++; $d++; } while (date("m", $mk) == $month); print_r($weekdays); 如果您的PHP

我想计算给定月份和年份中的工作日数。工作日是指周一至周五。我该怎么做?

一些基本代码:

$month = 12;
$weekdays = array();
$d = 1;

do {
    $mk = mktime(0, 0, 0, $month, $d, date("Y"));
    @$weekdays[date("w", $mk)]++;
    $d++;
} while (date("m", $mk) == $month);

print_r($weekdays);
如果您的PHP错误警告没有显示通知,请删除
@

试试这个

function getWeekdays($m, $y = NULL){
    $arrDtext = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri');

    if(is_null($y) || (!is_null($y) && $y == ''))
        $y = date('Y');

    $d = 1;
    $timestamp = mktime(0,0,0,$m,$d,$y);
    $lastDate = date('t', $timestamp);
    $workingDays = 0;
    for($i=$d; $i<=$lastDate; $i++){
        if(in_array(date('D', mktime(0,0,0,$m,$i,$y)), $arrDtext)){
            $workingDays++;
        }
    }
    return $workingDays;
}
函数getWeekdays($m,$y=NULL){ $arrDtext=数组('Mon','Tue','Wed','Thu','Fri'); if(is_null($y)|(!is_null($y)&&$y='') $y=日期('y'); $d=1; $timestamp=mktime(0,0,0,$m,$d,$y); $lastDate=日期('t',$timestamp); $workingDays=0;
对于($i=$d;$i查找给定月份的最后一天和工作日
然后执行一个简单的while循环,如:-

$dates = explode(',', date('t,N', strtotime('2013-11-01')));
$day = $dates[1]; 
$tot = $dates[0]; 
$cnt = 0;
while ($tot>1)
{   
    if ($day < 6)
    {   
        $cnt++;
    }   
    if ($day == 1)
    {   
        $day = 7;
    }   
    else
    {   
        $day--;
    }   
    $tot--;
}
$dates=explode(’,’,date('t,N',strottime('2013-11-01'));
$day=$dates[1];
$tot=$dates[0];
$cnt=0;
而($tot>1)
{   
如果($day<6)
{   
$cnt++;
}   
如果($day==1)
{   
$day=7;
}   
其他的
{   
美元日--;
}   
$tot--;
}

$cnt=给定月份的工作日(周一到周五)总数

这是我能想到的最简单的代码。 您确实需要创建一个数组或数据库表来保存假期,以获得真正的“工作日”计数,但这并不是要求的,所以现在开始吧,希望这对其他人有所帮助

function get_weekdays($m,$y) {
$lastday = date("t",mktime(0,0,0,$m,1,$y));
$weekdays=0;
for($d=1;$d<=$lastday;$d++) {
    $wd = date("w",mktime(0,0,0,$m,$d,$y));
    if($wd > 0 && $wd < 6) $weekdays++;
    }
return $weekdays;
}
函数get_平日($m,$y){
$lastday=日期(“t”,mktime(0,0,0,$m,1,$y));
$weekdays=0;
对于($d=1;$d0&$wd<6)$weekdays++;
}
返回$weekdays;
}

您不需要计算月内的每一天。您已经知道前28天包含20个工作日,无论发生什么情况。您所要做的就是确定最后几天。将起始值更改为29。然后将20个工作日添加到返回值中

function get_weekdays($m,$y) {
$lastday = date("t",mktime(0,0,0,$m,1,$y));
$weekdays=0;
for($d=29;$d<=$lastday;$d++) {
    $wd = date("w",mktime(0,0,0,$m,$d,$y));
    if($wd > 0 && $wd < 6) $weekdays++;
    }
return $weekdays+20;
}
函数get_平日($m,$y){
$lastday=日期(“t”,mktime(0,0,0,$m,1,$y));
$weekdays=0;
对于($d=29;$d0&$wd<6)$weekdays++;
}
返回$weekdays+20;
}

获取两个日期之间无节假日的工作日数:

使用示例:
工作日的回音数(“2013-12-23”、“2013-12-29”);
输出:
3

这将起作用

// oct. 2013
$month = 10;

// loop through month days
for ($i = 1; $i <= 31; $i++) {

    // given month timestamp
    $timestamp = mktime(0, 0, 0, $month, $i, 2012);

    // to be sure we have not gone to the next month
    if (date("n", $timestamp) == $month) {

        // current day in the loop
        $day = date("N", $timestamp);

        // if this is between 1 to 5, weekdays, 1 = Monday, 5 = Friday
        if ($day == 1 OR $day <= 5) {

            // write it down now
            $days[$day][] = date("j", $timestamp);
        }
    }
}

// to see if it works :)
print_r($days);
//2013年10月
$month=10;
//循环月日
对于($i=1;$iDateObject方法:

function getWorkingDays(DateTime $date) {
    $month = clone $date;
    $month->modify('last day of this month');
    $workingDays = 0;
    for ($i = $month->format('t'); $i > 28; --$i) {
        if ($month->format('N') < 6) {
            ++$workingDays;
        }
        $month->modify('-1 day');
    }

    return 20 + $workingDays;
}
函数getWorkingDays(DateTime$date){
$month=clone$date;
$month->modify(‘本月最后一天’);
$workingDays=0;
对于($i=$month->format('t');$i>28;--$i){
如果($month->format('N')<6){
++$工作日;
}
$month->modify('-1天');
}
返回20+美元工作日;
}

从任何日期开始计算一个月内的工作日:

public function getworkd($mday)
{
    $dn = new DateTime($mday);
    $dfrom = $dn->format('Y-m-01');
    $dtill = $dn->format('Y-m-t');
    $df = new DateTime($dfrom);
    $dt = new DateTime($dtill);
    $wdays = 0;
    while($df<=$dt)
    {
        $dof= $df->format('D') ;
        if( $dof == 'Sun' || $dof == 'Sat' ) ; else $wdays++;
        $df->add(new DateInterval('P1D'));
    }
    return $wdays;
}
公共函数getworkd($mday)
{
$dn=新日期时间($mday);
$dfrom=$dn->格式('Y-m-01');
$dtill=$dn->格式('Y-m-t');
$df=新日期时间($dfrom);
$dt=新日期时间($dtill);
$wdays=0;
而($dfformat('D');
if($dof=='Sun'|$dof=='Sat');else$wdays++;
$df->add(新的日期间隔('P1D'));
}
返回$wdays;
}

我提出了一个非循环函数。性能要好得多。它可能看起来很混乱,但它只需要询问PHP第一天的工作日和月份的天数:其余的是基于逻辑的算术运算

function countWorkDays($year, $month)
{
    $workingWeekdays   = 5;
    $firstDayTimestamp = mktime(0, 0, 0, $month, 1, $year);
    $firstDayWeekDay   = (int)date("N", $firstDayTimestamp); //1: monday, 7: saturday
    $upToDay           = (int)date("t", $firstDayTimestamp);

    $firstMonday = 1 === $firstDayWeekDay ? 1 : 9 - $firstDayWeekDay;
    $wholeWeeks  = $firstMonday < $upToDay ? (int)floor(($upToDay - $firstMonday + 1) / 7) : 0;
    $extraDays   = ($upToDay - $firstMonday + 1) % 7;

    $initialWorkdays      = $firstMonday > 1 && $firstDayWeekDay <= $workingWeekdays ? $workingWeekdays - $firstDayWeekDay + 1 : 0;
    $workdaysInWholeWeeks = $wholeWeeks * $workingWeekdays;
    $extraWorkdays        = $extraDays <= $workingWeekdays ? $extraDays : $workingWeekdays;

    return $initialWorkdays + $workdaysInWholeWeeks + $extraWorkdays;
}
函数countWorkDays($year,$month)
{
$workingWeekdays=5;
$firstDayTimestamp=mktime(0,0,0,$month,1,$year);
$firstDayWeekDay=(int)日期(“N”,$firstDayTimestamp);//1:monday,7:saturday
$upToDay=(int)日期(“t”,$firstDayTimestamp);
$firstMonday=1==$firstDayWeekDay?1:9-$firstDayWeekDay;
$wholeWeeks=$firstMonday<$uptday?(int)楼层(($uptday-$firstMonday+1)/7):0;
$extraDays=($upToDay-$firstMonday+1)%7;
$initialWorkdays=$firstMonday>1&&$firstDayWeekDay
这些函数在没有循环的情况下工作

这些函数使用以下公式计算工作日数:

  • 当月第一个星期一的天数
  • 月份天数
//主要功能
//一年中月份的工作日
函数CalculateEnumberOfWeekdaySatDate($month,$year)
{
//对不起,我不知道$month和$year的正确格式,我希望这是正确的。
//如有错误,请改正
$firstMondayInjurentMonth=(int)日期(“j”,strotime(“01的第一个星期一-$month-$year”);//获取当月的第一个星期一进行计算
$numberofdaysofcurrentmount=(int)日期(“t”,strotime(“01-$month-$year”);//月份天数
返回CalculateEnumberOfWeekdaysFromFirstMonday和NumberOfMonthDays($FirstMondayInjurentMonth,$numberOfDaysOfCurrentMonth);
}
//当月的周天数
函数CalculateEnumberOfWeekDaysInCurrentMonth()
{
$firstMondayInjurentMonth=(int)日期(“j”,strotime(“本月的第一个星期一”);//获取本月的第一个星期一进行计算
$numberOfDaysOfCurrentMonth=(int)日期(“t”);//本月的天数
返回CalculateEnumberOfWeekdaysFromFirstMonday和NumberOfMonthDays($FirstMondayInjurentMonth,$numberOfDaysOfCurrentMonth);
}
//辅助函数
函数CalculateEnumberOfWeekDays fromFirstMonday和NumberOfMonthDays($firstMondayInCurrentMonth,$numberOfDaysOfCurrentMonth)
{
返回$numberOfWeekDays=($start=($firstmondayirrentmonth-3))<0?0:$start)+floor($numberofdaysofcurrentmount-($firstmondayirrentmonth-1))/7)*5+($rest=($numberofdaysofcurrentmount-($firstmondayirrentmonth-1))
函数工作日($m,$y){
$days=cal_days,以月为单位(cal_GREGORIAN,$m,$y);
$working_days=0;
$days_rest=array(5,6);//星期五、星期六
对于($d=1;$d<$days+1;$d++){
if(!in_数组(日期(“w”,strotime({$d}-{$m}-{$y}”),$days_rest)){
$working_days++;
}
}
返回$working_天;
}

我创建了一个简单的函数,它取每月的$first\u day\u(星期日/星期一等)
// main functions 
// weekdays in month of year
function calculateNumberOfWeekDaysAtDate($month, $year)
{
    // I'm sorry, I don't know the right format for the $month and $year, I hope this is right.
    // PLEASE CORRECT IF WRONG
    $firstMondayInCurrentMonth = (int) date("j", strtotime("first monday of 01-$month-$year")); //get first monday in month for calculations
    $numberOfDaysOfCurrentMonth = (int) date("t", strtotime("01-$month-$year")); // number of days in month

    return calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth);
}

// week days in current month
function calculateNumberOfWeekDaysInCurrentMonth()
{
    $firstMondayInCurrentMonth = (int) date("j", strtotime("first monday of this month")); //get first monday in month for calculations
    $numberOfDaysOfCurrentMonth = (int) date("t"); // number of days in this month

    return calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth);
}

// helper functions
function calculateNumberOfWeekDaysFromFirstMondayAndNumberOfMonthDays($firstMondayInCurrentMonth, $numberOfDaysOfCurrentMonth)
{
    return $numberOfWeekDays = (($start = ($firstMondayInCurrentMonth - 3)) < 0 ? 0 : $start) + floor(($numberOfDaysOfCurrentMonth - ($firstMondayInCurrentMonth - 1)) / 7) * 5 + (($rest = (($numberOfDaysOfCurrentMonth - ($firstMondayInCurrentMonth - 1)) % 7)) <= 5 ? $rest : 5);
}
function workingDays($m,$y) {
    $days = cal_days_in_month(CAL_GREGORIAN, $m, $y);
    $workig_days = 0;
    $days_rest = array(5,6); //friday,saturday
    for ( $d=1 ; $d < $days+1 ; $d++ ) {
        if ( !in_array(date("w",strtotime("{$d}-{$m}-{$y}")),$days_rest)  ) {
            $workig_days++;
        }
    }
    return $workig_days;
}
date('N', strtotime(date("01-m-Y")));
date("t");
function workingDaysInMonth(int $first_day_of_month, int $month_last_date) : array
{
    $working_days = [];
    $day = $first_day_of_month;
    $working_day_count = 0;
    for ($i = 1; $i <= $month_last_date; $i++) {
        if ($day == 8) {
            $day = 1;
        }
        if (!($day == 6 || $day == 7)) {
            $working_day_count++;
            $working_days[$i] = $working_day_count;
        }
        $day++;
    }
    return $working_days;
}