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