Get the number of weekdays in a given month

I want to calculate the number of days on weekdays per month and year. Days of the week mean Monday to Friday. How to do it?

+5
php calendar days weekday
source share
12 answers

Some basic codes:

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

Remove @ if your PHP error warning does not show notifications.

+4
source share

You do not need to count every day in the month. You already know that the first 28 days contain 20 business days no matter what. All you have to do is determine the last few days. Change the initial value to 29. Then add 20 business days to the return value.

 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; } 
+22
source share

Try this

 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; } 
+2
source share

This is the easiest code I could come up with. You really need to create an array or a database table in order to spend the holidays in order to get the true “Working days” score, but that wasn’t what was set, so here you go, hope this helps someone.

 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; } 
+1
source share

Get the number of non-vacation working days between two dates:

Usage example:

 echo number_of_working_days('2013-12-23', '2013-12-29'); 

Output:

 3 

Function reference

+1
source share

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; } 
+1
source share

Calculate working days per month from any date:

 public function getworkd($mday) { $dn = new DateTime($mday); $dfrom = $dn->format('Ym-01'); $dtill = $dn->format('Ym-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; } 
+1
source share

Find the last day and weekday for a given month

then do a simple while loop: -

 $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 day of the week (Monday through Friday) for a specific month

0
source share

I came up with a function without a loop. Much better in terms of performance. This may seem messy, but you just need to ask PHP on the first day of the week and the number of days in the month: the rest are logic based arithmetic operations.

 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
source share

These functions work without cycles .

Functions calculate the number of days of the week using:

  • number the number of the first monday in the month
  • number of days in a 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
source share
 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
source share

it will work

 // 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); 
-one
source share

All Articles