Я пытался найти простое решение для получения диапазона дат, особенно с начала недели до конца недели.
Я нашел несколько решений, которые были очень сложными. Я хотел двухстрочное решение.
Я думал, что мое решение может помочь кому-то, поэтому я опубликовал его.
$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
потом, что дает нам первую и последнюю секунды недели.
Альтернативный подход к тому же результату:
$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'));
Лично я предпочитаю этот тип метода передаче строки типа «естественный язык», которая, для меня, имеет неоднозначное значение.