public static function calculateDateTime($time, \DateTime $referenceDate, $stopPrognosis = null)
{
// prevent changing the reference
$date = clone $referenceDate;
$offset = 0;
if (substr($time, 2, 1) == 'd') {
$offset = substr($time, 0, 2);
$time = substr($time, 3);
}
$timeObj = \DateTime::createFromFormat('H:i:s', $time, $date->getTimezone());
if ($timeObj === false) {
$timeObj = \DateTime::createFromFormat('H:i', $time, $date->getTimezone());
}
$date->setTime($timeObj->format('H'), $timeObj->format('i'), $timeObj->format('s'));
// check for passed midnight
$referenceTime = strtotime($referenceDate->format('H:i'));
$dateTime = strtotime($date->format('H:i'));
if (isset($stopPrognosis->Dep->Time)) {
$prognosisTime = strtotime((string) $stopPrognosis->Dep->Time);
if ($dateTime < $referenceTime && $prognosisTime < $referenceTime && $dateTime - $prognosisTime < 0) {
// we passed midnight
$offset = 1;
}
} elseif ($dateTime < $referenceTime) {
// we passed midnight
$offset = 1;
}
$date->add(new \DateInterval('P' . $offset . 'D'));
return $date;
}