Encuentra periodos semanales (comenzando un lunes) por un mes

Estoy tratando de encontrar los períodos semanales para un mes y año determinado. Las fechas deben comenzar un lunes y terminar un domingo. Si el 1 de cada mes es un domingo (Ex mayo 2011), debe ser el primer elemento.

Mayo 2011

1 de mayo (domingo)2 de mayo - 8 de mayo (lunes - domingo)9 de mayo - 15 de mayo (lunes - domingo)17 de mayo - 22 de mayo (lunes a domingo)23 de mayo - 29 de mayo (lunes - domingo)30 de mayo - 31 de mayo (lunes - martes)

septiembre 2012

1 de septiembre - 2 de septiembre3 de septiembre - 9 de septiembre10 de septiembre - 16 de septiembre17 de septiembre - 23 de septiembre24 de septiembre - 30 de septiembre

Estoy usando esta función para calcular los números de la semana para dos fechas, es decir, El 1er día del mes y el último día del mes.

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

Curiosamente, para el mes de enero, devuelve números de semana de [52, 1, 2, 3, 4] cuando estoy esperando [1, 2, 3, 4, 5].

Una vez que tengo los números de la semana, los estoy usando así:

//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 la función getWeekNumbers no devuelve los números de la semana que estoy esperando, no es sorprendente que la salida de la función anterior sea

24 de diciembre - 30 de diciembre (2012)02 de enero - 08 de enero (2012)09 de enero - 15 de enero (2012)16 de enero - 22 de enero (2012)23 de enero - 29 de enero (2012)

Tenga en cuenta que la primera línea (del 24 de diciembre al 30 de diciembre) es el final del año en curso (2012) y no el final del año pasado (2011).

Idealmente, quiero que se vea como

¿Algunas ideas? ¡¡Gracias!!

Respuestas a la pregunta(3)

Su respuesta a la pregunta