$begin = new \DateTime(date('Y-m-01'));
$interval = new \DateInterval('P1D');
$end_date = date('Y-m-') . date('t');
$end = new \DateTime($end_date);
$end->setTime(23,59,59);
$date = new \DatePeriod($begin,$interval, $end);
Вариант с нативным вычислением дат, чуть компактнее и удобочитаемость получше:
$begin = new \DateTime('first day of this month');
$interval = new \DateInterval('P1D');
$end = new \DateTime('last day of this month');
$end->setTime(23,59,59);
$date = new \DatePeriod($begin,$interval, $end);
Или не такой теоретически красивый, зато без странной подпорки:
for ($d = clone $begin; $d <= $end; $d->modify('next day midnight')) {
echo $d->format('Y-m-d'),PHP_EOL;
}