Как получить полный промежуток начала и конца недели

Я пытался найти простое решение для получения диапазона дат, особенно с начала недели до конца недели.

Я нашел несколько решений, которые были очень сложными. Я хотел двухстрочное решение.
Я думал, что мое решение может помочь кому-то, поэтому я опубликовал его.

1

Решение

$date = new \DateTime(/* any point in time and space */);

$week_start = new \DateTime(sprintf('%s today this week',           $date->format('Y-m-d H:i:s')));
$week_end   = new \DateTime(sprintf('%s today next week -1 second', $date->format('Y-m-d H:i:s')));

echo sprintf('%s -> %s', $week_start->format('Y-m-d H:i:s'), $week_end->format('Y-m-d H:i:s'));

Общепринятая особенность выражений PHP на английском языке состоит в том, как вы можете наследовать слова и даты друг от друга в том, что может показаться конфликтующим выражением.

Однако вы можете добавить несколько выражений, и каждое из них будет наследоваться от последнего.
Таким образом, добавляя конкретную дату и форматируя ее в начале выражения, вы можете добавить today чтобы получить начало этой даты.

После этого this week чтобы получить начало недели, наследует от того же, плюс todayтак что начало this week становится началом that week,

Для даты окончания я использовал next week по тому же принципу, но применяется -1 second потом, что дает нам первую и последнюю секунды недели.

1

Другие решения

Альтернативный подход к тому же результату:

$sunday = 0;
$monday = 1;
$date = new \DateTime(/* any point in time and space */);

$weekStart = (new \DateTime())->setISODate((int)$date->format('o'), (int)$date->format('W'), $monday)->setTime(0, 0, 0);
$weekEnd = (new \DateTime())->setISODate((int)$date->format('o'), (int)$date->format('W') + 1, $sunday)->setTime(23, 59, 59);

echo sprintf('%s -> %s', $weekStart->format('Y m d H:i:s'), $weekEnd->format('Y m d H:i:s'));

Лично я предпочитаю этот тип метода передаче строки типа «естественный язык», которая, для меня, имеет неоднозначное значение.

1

По вопросам рекламы [email protected]