Найти еженедельные периоды (начиная с понедельника) за месяц
Я пытаюсь найти еженедельные периоды для данного месяца и года. Даты должны начинаться в понедельник и заканчиваться в воскресенье. Если 1-е число месяца - воскресенье (например, май 2011 г.), оно должно быть первым элементом.
Май 2011
May 1 (Sunday) May 2 - May 8 (Monday - Sunday) May 9 - May 15 (Monday - Sunday) May 17 - Ma6y 22 (Monday - Sunday) May 23 - May 29 (Monday - Sunday) May 30 - May 31 (Monday - Tuesday)Сентябрь 2012
September 1 - September 2 September 3 - September 9 September 10 - September 16 September 17 - September 23 September 24 - September 30Я использую эту функцию, чтобы вычислить номера недель для двух дат - т.е. 1-й день месяца и последний день месяца.
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;
}
Странно, но в январе он возвращает номера недель [52, 1, 2, 3, 4], когда я ожидаю [1, 2, 3, 4, 5].
Получив номера недель, я использую их следующим образом:
//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);
}
Так как функция getWeekNumbers не возвращает номера недели, которые я ожидаю, неудивительно, что выходные данные вышеупомянутой функции
Dec 24 - Dec 30 (2012) Jan 02 - Jan 08 (2012) Jan 09 - Jan 15 (2012) Jan 16 - Jan 22 (2012) Jan 23 - Jan 29 (2012)Обратите внимание, что 1-я строка (24 декабря - 30 декабря) - это конец текущего года (2012), а не конец прошлого года (2011).
В идеале я хочу, чтобы это выглядело как
Есть идеи? Спасибо!!