Encontre períodos semanais (começando na segunda-feira) por um mês
Estou tentando encontrar os períodos semanais para um determinado mês e ano. As datas devem começar na segunda-feira e terminar no domingo. Se o primeiro dia do mês for um domingo (Ex de maio de 2011), deve ser o primeiro elemento.
Maio de 2011
1 de maio (domingo)2 de maio a 8 de maio (segunda a domingo)9 de maio - 15 de maio (segunda a domingo)17 de maio a 22 de maio (segunda a domingo)23 de maio a 29 de maio (segunda a domingo)30 de maio a 31 de maio (segunda a terça)Setembro de 2012
1 de setembro - 2 de setembro3 de setembro - 9 de setembro10 de setembro - 16 de setembro17 de setembro a 23 de setembro24 de setembro a 30 de setembroEstou usando essa função para calcular os números da semana para duas datas - por exemplo, o primeiro dia do mês e o último dia do mês.
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;
}
Estranhamente, para o mês de janeiro, ele retorna números de semana de [52, 1, 2, 3, 4] quando estou esperando [1, 2, 3, 4, 5].
Depois de ter os números da semana, estou usando-os assim:
//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 a função getWeekNumbers não está retornando os números da semana que estou esperando, não é surpreendente que a saída da função acima seja
24 de dezembro a 30 de dezembro (2012)02 de janeiro - 08 de janeiro (2012)Jan 09 - Jan 15 (2012)16 de janeiro a 22 de janeiro de 201223 de janeiro a 29 de janeiro de 2012Observe que a primeira linha (24 de dezembro a 30 de dezembro) é o final do ano atual (2012) e não o final do ano passado (2011).
Idealmente, eu quero que pareça
Alguma ideia? Obrigado!!