Finde wöchentliche Perioden (beginnend an einem Montag) für einen Monat

Ich versuche, die wöchentlichen Perioden für einen bestimmten Monat und ein bestimmtes Jahr zu finden. Die Daten sollten an einem Montag beginnen und an einem Sonntag enden. Wenn der 1. des Monats ein Sonntag ist (z. B. Mai 2011), sollte dies das erste Element sein.

Mai 2011

1. Mai (Sonntag)2. Mai - 8. Mai (Montag - Sonntag)9. Mai - 15. Mai (Montag - Sonntag)17. Mai - 22. Mai (Montag - Sonntag)23. Mai - 29. Mai (Montag - Sonntag)30. Mai - 31. Mai (Montag - Dienstag)

September 2012

1. September - 2. September3. September - 9. September10. September - 16. September17. September - 23. September24. September - 30. September

Ich benutze diese Funktion, um die Wochenzahlen für zwei Daten zu berechnen - d. H. der 1. Tag des Monats und der letzte Tag des Monats.

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

Seltsamerweise werden für den Monat Januar Wochenzahlen von [52, 1, 2, 3, 4] zurückgegeben, wenn ich [1, 2, 3, 4, 5] erwarte.

Sobald ich die Wochennummern habe, benutze ich sie wie folgt:

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

Da die Funktion getWeekNumbers nicht die erwarteten Wochenzahlen zurückgibt, ist es nicht verwunderlich, dass die Ausgabe der obigen Funktion ist

24. - 30. Dezember (2012)02. Jan. - 08. Jan. (2012)09. bis 15. Januar 201216. bis 22. Januar 201223. bis 29. Januar 2012

Beachten Sie, dass die erste Zeile (24. - 30. Dezember) das Ende des aktuellen Jahres (2012) und nicht das Ende des letzten Jahres (2011) ist.

Idealerweise möchte ich, dass es so aussieht

Irgendwelche Ideen? Vielen Dank!!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage