PHP počet pracovních dní v měsíci, svátky, velikonoce

Prostřednictvím této nehezky designované funkce zjistíme počet pracovních dní v daném měsíci nebo počet pracovních dní zbývajících do konce měsíce 🙂
Zohledňujeme státní svátky, velikonoce i velký pátek…

<?php 
echo workingDaysInThisMonth ( strtotime ( '2017-12-01' ) ); 

function workingDaysInThisMonth ( $date = false ) 
{ 
  if ( !$date ) { 
    $date = time (); 
  } 
  $holidays = [ 
     1 => [1 ],
     5 => [1, 5 ],
     7 => [5, 6 ],
     9 => [28 ],
     10 => [28 ],
     11 => [17 ],
     12 => [24, 25, 26 ]
 ];

 $easter = date ( 'd.m.Y', strtotime ( date ( 'Y-m-d', easter_date ( date ( 'Y', $date ) ) ) . ' +1 days' ) );
 $bigFriday = date ( 'd.m.Y', strtotime ( date ( 'Y-m-d', easter_date ( date ( 'Y', $date ) ) ) . ' previous friday' ) );
 $holidays[ date ( 'n', strtotime ( $easter ) ) ][] = ( int ) date ( 'j', strtotime ( $easter ) );
 $holidays[ date ( 'n', strtotime ( $bigFriday ) ) ][] = ( int ) date ( 'j', strtotime ( $bigFriday ) );
 for ( $m = 1; $m <= 12; $m++ ) {
  for ( $d = 1; $d <= date ( 't', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-01' ) ); $d++ ) {
   if ( date ( 'w', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) ) == 0 ) {
    $holidays[ date ( 'n', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) ) ][] = ( int ) date ( 'j', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) );
   }
   if ( date ( 'w', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) ) == 6 ) {
    $holidays[ date ( 'n', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) ) ][] = ( int ) date ( 'j', strtotime ( date ( 'Y', $date ) . '-' . str_pad ( $m, 2, '0', STR_PAD_LEFT ) . '-' . str_pad ( $d, 2, '0', STR_PAD_LEFT ) ) );
   }
  }
 }

 $days = 0;
 $tomorrow = date ( 'Y-m-d', strtotime ( '+1 day', $date ) );
 $today = date ( 'Y-m-d', $date );
 if ( date ( 'n', strtotime ( $tomorrow ) ) != date ( 'n', strtotime ( $today ) ) ) {
  return $days;
 }

 for ( $d = date ( 'j', strtotime ( $tomorrow ) ); $d <= date ( 't', strtotime ( $tomorrow ) ); $d++ ) {
  if ( !in_array ( $d, $holidays[ date ( 'n', strtotime ( $tomorrow ) ) ] ) ) {
   $days++;
  }
 }
 return $days;
}

Komentáře jsou uzavřeny.