у меня есть 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
Я не могу найти правильное решение, охватывающее все крайние случаи 🙁
Задача ещё не решена.
Других решений пока нет …