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. SeptemberIch 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 2012Beachten 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!!