By your examples, you only want the days from Monday to Friday of the current month. So, you can take advantage of the relative formats to iterate through the dates:
$data = new DateTime('first day of this month');
$dow = $data->format('N');
if ($dow == 6 || $dow == 7) {
// se for sábado ou domingo, ajusta para a próxima segunda-feira
$data->modify('Monday');
}
$mes = $data->format('m');
$mesmo_mes = TRUE;
while ($mesmo_mes) {
$inicio = $data->format("Y-m-d");
$data->modify('Friday');
if ($mes != $data->format('m')) {
// foi para o mês seguinte, voltar para o mês atual e ajustar para para o último dia
$data = new DateTime('last day of this month');
$mesmo_mes = FALSE;
}
echo "{$inicio} - {$data->format('Y-m-d')} <br>";
$data->modify('Monday');
if ($mes != $data->format('m')) {
break; // se a próxima segunda-feira está no mês seguinte, sai do loop
}
}
I start on the first day of the month and go until next Friday (using modify('Friday')
). In case Friday is next month, I make an adjustment for the last day of the month.
I also treat other cases, as if the first day of the month falls on a weekend, I set for next Monday. In the middle of the loop, if the next Monday is next month (i.e., the month can end on Saturday or Sunday), I don’t need to print the respective week.
Then I print the beginning and end of each week in the format indicated (year-month-day).