Вот то, что я сейчас использую через 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
Разделение времени кажется неуклюжим, но может быть лучшим способом?Подход заключается в следующем:
- Создайте метку времени с временем теста в тот же день, что и метка времени, которую я проверяю.Это будет метка времени, которую я ищу.
- Если метка времени, которую я проверяю, идет после метки времени, созданной на предыдущем шаге, то добавьте к ней день.
IЯ проверил это вокруг летнего времени, и, к счастью, Carbon / Datetime сохраняет то же время при добавлении дня в течение периода летнего времени, где день будет 25 или 23 часа, в зависимости от того, как он идет.
Я все еще думаю, что есть более "линейное время" способ сделать это, но это кажется простым и надежным.Спасибо @ michael-stokoe здесь, в офисе, за мое руководство по этому вопросу.