I’ve built a small class that responds to an array with the information you need.
class DiasUteis {
public static function contarDiasUteis($data, $formato = 'd/m/Y') {
$dt = DateTime::createFromFormat($formato, $data);
if ($dt === false) {
echo "ERRO: A data informada '$data', precisa estar no formato '$formato'.";
exit;
}
$dataUtil = DiasUteis::diaUtil($dt); // a data é útil(true/false)
$ano = date_format($dt, 'Y');
$mes = date_format($dt, 'n');
$ultimo_dia = (integer) date_format($dt, 't');
$diasUteisNoMes = 0;
$diasUteisAteData = 0;
for ($dia = 1; $dia <= $ultimo_dia; $dia++) {
$dia_contar = DateTime::createFromFormat('j/n/Y', "$dia/$mes/$ano");
if (DiasUteis::diaUtil($dia_contar)) {
$diasUteisNoMes++;
if ($dia_contar <= $dt) {
$diasUteisAteData++;
}
}
}
return [
'data_util' => $dataUtil
, 'data_dia_semana' => date_format($dt, 'l')
, 'dias_uteis_no_mes' => $diasUteisNoMes
, 'dias_uteis_ate_data' => $diasUteisAteData
, 'dias_uteis_faltam' => $diasUteisNoMes - $diasUteisAteData
];
}
private static function diaUtil($dt) {
if ((date_format($dt, 'N') === '6') || (date_format($dt, 'N') === '7')) {
return false;
} else {
return true;
}
}
}
How to use:
$resultado = DiasUteis::contarDiasUteis('2016-07-19', 'Y-m-d');
echo '<pre>';
var_dump($resultado);
echo '</pre>';
Returns:
array(5) {
["data_util"]=>
bool(true)
["data_dia_semana"]=>
string(7) "Tuesday"
["dias_uteis_no_mes"]=>
int(22)
["dias_uteis_ate_data"]=>
int(13)
["dias_uteis_faltam"]=>
int(9)
}
I recommend a reading on PHP Date and Time Documentation.
I hope I’ve helped!
Related: How to know if today’s date is Saturday or Sunday (weekend) in PHP?
– rray