在给定时间戳之后查找给定时间的下一个事件

问题描述 投票:0回答:2

给定一个任意时间戳(例如2019-02-26 10:30:00),我想找到下一次出现的任意时间。

例如,下一次出现的12:00:00将是2019-02-26 12:00:00,但下一次出现的09:00:00将是2019-02-27 09:00:00的第二天。结果可能是CarbonDatetime对象。测试时间只是一个字符串,如图所示。

有没有办法在本机PHP或PHP Carbon中计算这个,而无需在时间段内有条件地装箱。一个显而易见的方法是查看测试的时间是否超过了today的检查时间,如果是,则将结果作为检查时间加上24小时(第二天)。对我来说,感觉太过剁碎和加入日期和时间,所以有没有办法通过考虑时间成为一个简单的线性线来计算它?

使用夏令时,所有时间都在一个时区内。注意:任意日期时间和检查时间将保持清除DST转换,即01:0002:00,所以希望它们不会成为一个需要考虑的问题。

php php-carbon
2个回答
1
投票

简短的回答是不适用于PHP(部分答案,我不是Carbon的专家,但从快速看它也没有,但你可以从下面的代码创建一个宏)。

然而,在三元条件下,单线程很简单恕我直言(如果你想与当前日期和时间比较,用DateTime($str)替换第二个DateTime(),如果你想在第二天比较完全相同的话,你可以用>=改变> ):

$str = '2019-02-26 10:30:00';

$date1 = ( ($a = (new DateTime($str))->setTime(12,00)) >= (new DateTime($str)) ) ? $a : $a->modify('+1 day');

$date2 = ( ($a = (new DateTime($str))->setTime(9,00)) >= (new DateTime($str)) ) ? $a : $a->modify('+1 day');

echo $date1->format('Y-m-d H:i:s'); //2019-02-26 12:00:00
echo $date2->format('Y-m-d H:i:s'); //2019-02-27 09:00:00

快速说明:您给我们的不是时间戳,而是格式化的日期。


1
投票

以下是我现在通过Carbon使用的内容,它似乎给了我正确的结果:

        $dateTime = Carbon::parse('2019-03-30 17:34:50', 'Europe/London');

        $testTime = '16:00:00';

        list ($hour, $minute, $second) = explode(':', $testTime);

        $nextTimeOccurrence = $dateTime
            ->copy() // Carbon 1 only
            ->hour($hour)->minute($minute)->second($second);

        if ($dateTime->gt($nextTimeOccurrence)) {
            $nextTimeOccurrence = $nextTimeOccurrence->addDay();
        }

        // $nextTimeOccurrence is the next occurrence of $testTime after $dateTime

时间的分裂似乎很笨拙,但可能是最好的方式?方法是:

  • 在我正在检查的时间戳的同一天创建一个带有测试时间的时间戳。这将是我正在寻找的时间戳。
  • 如果我正在检查的时间戳是在上一步中创建的时间戳之后,则向其添加一天。

我在DST周围进行了测试,很高兴Carbon / Datetime在DST期间增加一天时保持相同的时间,其中一天会有25小时或23小时,具体取决于它的走向。

我仍然认为有一种更“线性时间”的方法可以做到这一点,但这看起来简单而有力。感谢@ michael-stokoe在办公室,我的主角。

© www.soinside.com 2019 - 2024. All rights reserved.