在一个区间内向上舍入到下一个传递日期

时间:2015-04-06 18:24:54

标签: php date datetime intervals

我有一个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

我无法找到涵盖所有边缘案例的正确解决方案:(

0 个答案:

没有答案