Округление до следующей проходной даты в интервале

у меня есть DateTime объект в качестве начальной точки и объекта DateInterval и другой DateTime объект. Теперь мне нужно найти следующую возможную дату, проходящую в интервале, который начинается с даты начала.

Значения обоих DateTime объекты и DateInterval полностью не определены. Таким образом, интервал может содержать что-то вроде 1 года или 365 дней, которые имеют разные значения (високосный год), и он может содержать летнее время или совершенно разные часовые пояса.

Может кто-нибудь помочь мне, как найти следующую дату и время, не повторяя интервал между отверстиями?

У меня есть следующая функция округления, выполняющая итерацию, но это может быть очень медленным на длинных итерациях 🙁

function ceilDateTimeByInterval(DateTime $date, DateInterval $interval, DateTime $base) {
if ($date < $base) {
return null;
}

$result = clone $base;
while ($date > $result) {
$result = $result->add($interval);
}

$result = $result->setTimezone($date->getTimezone());
return $result;
}

Пример:

$base = new DateTime("2000-03-04 00:00:00 Europe/Berlin");
$date = new DateTime("2016-06-03 02:00:00 UTC");
$interval = new DateInterval('P5Y5M0D');
echo ceilDateTimeByInterval($date, $interval, $base)->format('Y-m-d H:i:s e');
// = 2016-06-03 22:00:00 UTC

$base = new DateTime("1206-03-04 00:00:00 Europe/Berlin");
$date = new DateTime("2016-06-03 22:00:00 UTC");
$interval = new DateInterval('P10D');
echo ceilDateTimeByInterval($date, $interval, $base)->format('Y-m-d H:i:s e');
// = 2016-06-04 22:00:00 UTC

$base = new DateTime("1206-03-04 00:00:00 Europe/Berlin");
$date = new DateTime("2016-06-03 22:45:34 UTC");
$interval = new DateInterval('P1WT12H12345S');
echo ceilDateTimeByInterval($date, $interval, $base)->format('Y-m-d H:i:s e');
// = 2016-06-04 22:45:45 UTC

Я не могу найти правильное решение, охватывающее все крайние случаи 🙁

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]