<?php
function getIntervalEnd($pointer, $interval){
$to = clone $pointer;
// For minute interval, return end of the pointers minute
if($interval == 'PT1M')
$to->setTime($to->format('H'), $to->format('i'), 59);
// For hour interval, return end of the pointers hour
elseif($interval == 'PT1H')
$to->setTime($to->format('H'), 59, 59);
// For day interval, return end of the pointers day
elseif($interval == 'P1D')
$to->setTime(23, 59, 59);
// For week interval, return end of the pointers week
elseif($interval == 'P7D'){
if($to->format('N') != 7)
$to->setTimestamp(strtotime('next sunday', $to->getTimestamp()));
$to->setTime(23, 59, 59);
}
// For month interval, return end of the pointers month
elseif($interval == 'P1M')
$to->setDate($to->format('Y'), $to->format('m'),$to->format('t'))->setTime(23, 59, 59);
// For year interval, return end of the pointers year
elseif($interval == 'P1Y')
$to->setDate($to->format('Y'), 12, 31)->setTime(23, 59, 59);
return $to;
}
echo getIntervalEnd(new \DateTime(), 'P1D')->format('c');