我有一个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
我无法找到涵盖所有边缘案例的正确解决方案:(