Get number of weekdays in a given month

后端 未结 12 2118
无人及你
无人及你 2020-12-03 15:56

I want to calculate the number of weekdays days in a give month and year. Weekdays means monday to friday. How do i do it ?

相关标签:
12条回答
  • 2020-12-03 16:24

    Find the last day and the weekday for the given month
    then do a simple while loop like :-

    $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--;
    }
    

    $cnt = total of weekday (Monday to Friday) for a given month

    0 讨论(0)
  • 2020-12-03 16:26

    try this one

    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;
    }
    
    0 讨论(0)
  • 2020-12-03 16:30
    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;
    }
    
    0 讨论(0)
  • 2020-12-03 16:33

    These functions work Without Loops.

    The functions calculate the number of weekdays using:

    • day-number of first monday in month
    • number of days in month
    // 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);
    }
    
    0 讨论(0)
  • 2020-12-03 16:34

    DateObject method:

    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;
    }
    
    0 讨论(0)
  • 2020-12-03 16:34

    I've come up with a non-loop function. Much better in terms of performance. It might seem messy but it just needs to ask PHP the first day's weekday and the month's number days: the rest are arithmetical operations based on logic.

    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;
    }
    
    0 讨论(0)
提交回复
热议问题