如何在没有函数的情况下获得给定月份的总工作日


How to get the total working days of the given month without function

如果不使用函数,我如何获得一个月的总工作天数

function countDays($year, $month, $ignore) {
    $count = 0;
    $counter = mktime(0, 0, 0, $month, 1, $year);
    while (date("n", $counter) == $month) {
        if (in_array(date("w", $counter), $ignore) == false) {
            $count++;
        }
        $counter = strtotime("+1 day", $counter);
    }
    return $count;
}
echo countDays(2013, 1, array(0, 6)); // 23

在上面的代码中,使用了find函数。。

但是我怎么能在不使用函数的情况下使用它呢?

这是PHP手册中date()函数页上用户评论中的一个函数。这是对评论中早期功能的改进,增加了对闰年的支持。

输入开始和结束日期,以及可能介于两者之间的任何假日的数组,它将以整数形式返回工作日:


<?php
    //The function returns the no. of business days between two dates and it skips the holidays
    function getWorkingDays($startDate,$endDate,$holidays){
        // do strtotime calculations just once
        $endDate = strtotime($endDate);
        $startDate = strtotime($startDate);

        //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24
        //We add one to inlude both dates in the interval.
        $days = ($endDate - $startDate) / 86400 + 1;
        $no_full_weeks = floor($days / 7);
        $no_remaining_days = fmod($days, 7);
        //It will return 1 if it's Monday,.. ,7 for Sunday
        $the_first_day_of_week = date("N", $startDate);
        $the_last_day_of_week = date("N", $endDate);
        //---->The two can be equal in leap years when february has 29 days, the equal sign is added here
        //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.
        if ($the_first_day_of_week <= $the_last_day_of_week) {
            if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--;
            if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--;
        }
        else {
            // (edit by Tokes to fix an edge case where the start day was a Sunday
            // and the end day was NOT a Saturday)
            // the day of the week for start is later than the day of the week for end
            if ($the_first_day_of_week == 7) {
                // if the start date is a Sunday, then we definitely subtract 1 day
                $no_remaining_days--;
                if ($the_last_day_of_week == 6) {
                    // if the end date is a Saturday, then we subtract another day
                    $no_remaining_days--;
                }
            }
            else {
                // the start date was a Saturday (or earlier), and the end date was (Mon..Fri)
                // so we skip an entire weekend and subtract 2 days
                $no_remaining_days -= 2;
            }
        }
        //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder
    //---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it
       $workingDays = $no_full_weeks * 5;
        if ($no_remaining_days > 0 )
        {
          $workingDays += $no_remaining_days;
        }
        //We subtract the holidays
        foreach($holidays as $holiday){
            $time_stamp=strtotime($holiday);
            //If the holiday doesn't fall in weekend
            if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
                $workingDays--;
        }
        return $workingDays;
    }
    //Example:
    $holidays=array("2008-12-25","2008-12-26","2009-01-01");
    echo getWorkingDays("2008-12-22","2009-01-02",$holidays)
    // => will return 7
    ?>
$numdays = cal_days_in_month (CAL_GREGORIAN, $mon,$yr);
for($i=1;$i<=$numdays;$i++)
    {
    if(date('N',strtotime($y.'-'.$m.'-'.$i))==7)
    $sun++;
    }

计算员工工作日后的周日计算

$tot=$numdays-$sun-$emp_working_days;echo $tot;

我不知道你到底想要什么。但是,可能是这个吗?

$year = 2015;
$month = 3;
$count = 0;
$counter = mktime(0, 0, 0, $month, 1, $year);
while (date("n", $counter) == $month) {
    if (in_array(date("w", $counter), $ignore) == false) {
        $count++;
    }
    $counter = strtotime("+1 day", $counter);
}
echo $count;