Znajdź okresy tygodniowe (od poniedziałku) przez miesiąc

Próbuję znaleźć tygodniowe okresy dla danego miesiąca i roku. Daty powinny rozpoczynać się w poniedziałek i kończyć w niedzielę. Jeśli pierwszy miesiąc to niedziela (Ex May 2011), powinien to być pierwszy element.

Maj 2011 r

1 maja (niedziela)2 maja - 8 maja (poniedziałek - niedziela)9 maja - 15 maja (poniedziałek - niedziela)17 maja - Ma6y 22 (poniedziałek - niedziela)23 maja - 29 maja (poniedziałek - niedziela)30 maja - 31 maja (poniedziałek - wtorek)

Wrzesień 2012 r

1 września - 2 września3 września - 9 września10 września - 16 września17 września - 23 września24 września - 30 września

Używam tej funkcji do obliczania liczb tygodniowych dla dwóch dat - tzn. pierwszy dzień miesiąca i ostatni dzień miesiąca.

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;
}

Co dziwne, w styczniu zwraca liczby tygodniowe [52, 1, 2, 3, 4], gdy się tego spodziewam [1, 2, 3, 4, 5].

Gdy mam już numery tygodni, używam ich w ten sposób:

//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);
    }

Ponieważ funkcja getWeekNumbers nie zwraca liczb tygodniowych, których się spodziewam, nie jest zaskakujące, że wynikiem powyższej funkcji jest

24 grudnia - 30 grudnia (2012)02 stycznia - 08 stycznia (2012)09 stycznia - 15 stycznia (2012)16 stycznia - 22 stycznia (2012)23 stycznia - 29 stycznia (2012)

Zauważ, że pierwsza linia (24 grudnia - 30 grudnia) to koniec bieżącego roku (2012), a nie koniec ostatniego roku (2011).

Idealnie chciałbym, żeby to wyglądało

Jakieś pomysły? Dzięki!!

questionAnswers(3)

yourAnswerToTheQuestion