Получение ближайшего DateTime с использованием форматов strtotime - PullRequest
0 голосов
/ 11 января 2020

DateTime принимает форматы, приемлемые для strtotime, и поэтому DateTime::modify('previous sunday') и DateTime::modify('sunday next week') изменят метку времени объекта DateTime на предыдущее воскресенье и следующее воскресенье соответственно.

Как изменить метку времени на ближайшее воскресенье? Например, если метка времени DateTime в настоящее время находится в понедельник, она будет изменена на предыдущее воскресенье, а если в настоящее время она была в пятницу, она будет изменена на следующее воскресенье?

1 Ответ

1 голос
/ 11 января 2020

Относительные форматы времени не поддерживают «ближайший день» (о котором я знаю). Вы можете сравнить следующие и предыдущие различия, чтобы увидеть, какая из них ближе всего:

function closestWeekday(DateTimeInterface $date, int $dayOfWeek) {
    if( !($date instanceof DateTimeImmutable) ) {
        $date = DateTimeImmutable::createFromMutable( $date );
    }
    $dowStr = jddayofweek($dayOfWeek, CAL_DOW_LONG);
    $prevDate = $date->modify('previous ' . $dowStr);
    $nextDate = $date->modify('this ' . $dowStr);
    $prevDiff = $prevDate->diff($date);
    $nextDiff = $nextDate->diff($date);
    return ($prevDiff->days < $nextDiff->days) ? $prevDate : $nextDate;
}


$wed = new DateTime('wednesday');
$thur = new DateTime('thursday');

// Find closest Sunday to this Wednesday
$closestDay1 = closestWeekday($wed, 6);

// Find closest Sunday to this Thursday
$closestDay2 = closestWeekday($thur, 6);

// Second argument is an integer representing the day of week you want to find
// 0 = Monday, 1 = Tuesday, 2 = Wednesday, ..., 6 = Sunday
...