给定一个任意时间戳(例如2019-02-26 10:30:00
),我想找到下一次出现的任意时间。
例如,下一次出现的12:00:00
将是2019-02-26 12:00:00
,但下一次出现的09:00:00
将是2019-02-27 09:00:00
的第二天。结果可能是Carbon
或Datetime
对象。测试时间只是一个字符串,如图所示。
有没有办法在本机PHP或PHP Carbon中计算这个,而无需在时间段内有条件地装箱。一个显而易见的方法是查看测试的时间是否超过了today
的检查时间,如果是,则将结果作为检查时间加上24小时(第二天)。对我来说,感觉太过剁碎和加入日期和时间,所以有没有办法通过考虑时间成为一个简单的线性线来计算它?
使用夏令时,所有时间都在一个时区内。注意:任意日期时间和检查时间将保持清除DST转换,即01:00
到02:00
,所以希望它们不会成为一个需要考虑的问题。
简短的回答是不适用于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
快速说明:您给我们的不是时间戳,而是格式化的日期。
以下是我现在通过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在办公室,我的主角。