Найти еженедельные периоды (начиная с понедельника) за месяц

Я пытаюсь найти еженедельные периоды для данного месяца и года. Даты должны начинаться в понедельник и заканчиваться в воскресенье. Если 1-е число месяца - воскресенье (например, май 2011 г.), оно должно быть первым элементом.

Май 2011

May 1 (Sunday) May 2 - May 8 (Monday - Sunday) May 9 - May 15 (Monday - Sunday) May 17 - Ma6y 22 (Monday - Sunday) May 23 - May 29 (Monday - Sunday) May 30 - May 31 (Monday - Tuesday)

Сентябрь 2012

September 1 - September 2 September 3 - September 9 September 10 - September 16 September 17 - September 23 September 24 - September 30

Я использую эту функцию, чтобы вычислить номера недель для двух дат - т.е. 1-й день месяца и последний день месяца.

public function getWeekNumbers($startDate, $endDate)
{
    $p = new DatePeriod(
            new DateTime($startDate),
            new DateInterval('P1W'),
            new DateTime($endDate)
    );

    $weekNumberList = array();

    foreach ($p as $w)
    {
        $weekNumber = $w->format('W');
        $weekNumberList[] = ltrim($weekNumber, '0');
    }

    return $weekNumberList;
}

Странно, но в январе он возвращает номера недель [52, 1, 2, 3, 4], когда я ожидаю [1, 2, 3, 4, 5].

Получив номера недель, я использую их следующим образом:

//The following loop will populate the dataset with the entire month's durations - regardless if hours were worked or not.
    $firstDayOfMonth = date('Y-m-d', strtotime("first day of {$this->year}-{$monthName}"));
    $lastDayOfMonth = date('Y-m-d', strtotime("last day of {$this->year}-{$monthName}"));

    foreach ($this->getWeekNumbers($firstDayOfMonth, $lastDayOfMonth) as $key => $weekId)
    {
        // find first mоnday of the year
        $firstMon = strtotime("mon jan {$this->year}");

        // calculate how many weeks to add
        $weeksOffset = $weekId - date('W', $firstMon);

        $beginDays = $weeksOffset * 7;
        $endDays = ($weeksOffset * 7) + 6;

        $searchedMon = strtotime(date('Y-m-d', $firstMon) . " +{$beginDays} days");
        $searchedSun = strtotime(date('Y-m-d', $firstMon) . " +{$endDays} days");

        echo date("M d", $searchedMon) . " - " . date("M d", $searchedSun);
    }

Так как функция getWeekNumbers не возвращает номера недели, которые я ожидаю, неудивительно, что выходные данные вышеупомянутой функции

Dec 24 - Dec 30 (2012) Jan 02 - Jan 08 (2012) Jan 09 - Jan 15 (2012) Jan 16 - Jan 22 (2012) Jan 23 - Jan 29 (2012)

Обратите внимание, что 1-я строка (24 декабря - 30 декабря) - это конец текущего года (2012), а не конец прошлого года (2011).

В идеале я хочу, чтобы это выглядело какenter image description here

Есть идеи? Спасибо!!

Ответы на вопрос(3)

Ваш ответ на вопрос