Сплит недели месяца - PullRequest
       7

Сплит недели месяца

1 голос
/ 21 марта 2020

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

Я бы хотел получить что-то вроде календаря Windows 10. Таким образом, результат равен

2020-03-01 to 2020-03-01
2020-03-02 to 2020-03-08
2020-03-09 to 2020-03-15
2020-03-16 to 2020-03-22
2020-03-23 to 2020-03-29
2020-03-30 to 2020-03-31

Windows 10 calendar example

КОД

$start_date = date("Y-m-d", strtotime("first day of this month"));
$end_date = date("Y-m-d", strtotime("last day of this month"));

function getWeekDates($date, $start_date, $end_date) {
  $week =  date('W', strtotime($date));
  $year =  date('Y', strtotime($date));
  $from = date("Y-m-d", strtotime("{$year}-W{$week}+1"));
  if($from <= $start_date){
    $from = $start_date;
  }

  $to = date("Y-m-d", strtotime("{$year}-W{$week}-7"));
  if($to >= $end_date){
    $to = $end_date;
  }

  echo $from." to ".$to.'<br>';
}

for($date = $start_date; $date <= $end_date; $date = date('Y-m-d', strtotime($date. ' + 7 day'))){
  echo getWeekDates($date, $start_date, $end_date);
  echo "\n";
}

Что приводит к

Последние два дня месяца отсутствуют (30 и 31).

2020-03-01 to 2020-03-01
2020-03-02 to 2020-03-08
2020-03-09 to 2020-03-15
2020-03-16 to 2020-03-22
2020-03-23 to 2020-03-29

1 Ответ

0 голосов
/ 21 марта 2020

Вы можете использовать DateTime объекты, чтобы сделать это более легко, устанавливая время начала в качестве первого понедельника или до начала месяца, а затем добавляя неделю за раз, пока не закончится конец месяца. :

$month_start = new DateTime("first day of this month");
$month_end = new DateTime("last day of this month");

// find the Monday on/before the start of the month
$start_date = clone $month_start;
$start_date->modify((1 - $start_date->format('N')) . ' days');

while ($start_date <= $month_end) {
    echo max($month_start, $start_date)->format('Y-m-d') . ' to ' . min($start_date->modify('+6 days'), $month_end)->format('Y-m-d') . "\n";
    $start_date->modify('+1 day');
}

Вывод:

2020-03-01 to 2020-03-01
2020-03-02 to 2020-03-08
2020-03-09 to 2020-03-15
2020-03-16 to 2020-03-22
2020-03-23 to 2020-03-29
2020-03-30 to 2020-03-31

Демонстрация на 3v4l.org

...