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śniaUż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!!