Encontre períodos semanais (começando na segunda-feira) por um mês

Estou tentando encontrar os períodos semanais para um determinado mês e ano. As datas devem começar na segunda-feira e terminar no domingo. Se o primeiro dia do mês for um domingo (Ex de maio de 2011), deve ser o primeiro elemento.

Maio de 2011

1 de maio (domingo)2 de maio a 8 de maio (segunda a domingo)9 de maio - 15 de maio (segunda a domingo)17 de maio a 22 de maio (segunda a domingo)23 de maio a 29 de maio (segunda a domingo)30 de maio a 31 de maio (segunda a terça)

Setembro de 2012

1 de setembro - 2 de setembro3 de setembro - 9 de setembro10 de setembro - 16 de setembro17 de setembro a 23 de setembro24 de setembro a 30 de setembro

Estou usando essa função para calcular os números da semana para duas datas - por exemplo, o primeiro dia do mês e o último dia do mês.

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

Estranhamente, para o mês de janeiro, ele retorna números de semana de [52, 1, 2, 3, 4] quando estou esperando [1, 2, 3, 4, 5].

Depois de ter os números da semana, estou usando-os assim:

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

Como a função getWeekNumbers não está retornando os números da semana que estou esperando, não é surpreendente que a saída da função acima seja

24 de dezembro a 30 de dezembro (2012)02 de janeiro - 08 de janeiro (2012)Jan 09 - Jan 15 (2012)16 de janeiro a 22 de janeiro de 201223 de janeiro a 29 de janeiro de 2012

Observe que a primeira linha (24 de dezembro a 30 de dezembro) é o final do ano atual (2012) e não o final do ano passado (2011).

Idealmente, eu quero que pareça

Alguma ideia? Obrigado!!

questionAnswers(3)

yourAnswerToTheQuestion