Encuentra periodos semanales (comenzando un lunes) por un mes
Estoy tratando de encontrar los períodos semanales para un mes y año determinado. Las fechas deben comenzar un lunes y terminar un domingo. Si el 1 de cada mes es un domingo (Ex mayo 2011), debe ser el primer elemento.
Mayo 2011
1 de mayo (domingo)2 de mayo - 8 de mayo (lunes - domingo)9 de mayo - 15 de mayo (lunes - domingo)17 de mayo - 22 de mayo (lunes a domingo)23 de mayo - 29 de mayo (lunes - domingo)30 de mayo - 31 de mayo (lunes - martes)septiembre 2012
1 de septiembre - 2 de septiembre3 de septiembre - 9 de septiembre10 de septiembre - 16 de septiembre17 de septiembre - 23 de septiembre24 de septiembre - 30 de septiembreEstoy usando esta función para calcular los números de la semana para dos fechas, es decir, El 1er día del mes y el último día del mes.
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;
}
Curiosamente, para el mes de enero, devuelve números de semana de [52, 1, 2, 3, 4] cuando estoy esperando [1, 2, 3, 4, 5].
Una vez que tengo los números de la semana, los estoy usando así:
//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 la función getWeekNumbers no devuelve los números de la semana que estoy esperando, no es sorprendente que la salida de la función anterior sea
24 de diciembre - 30 de diciembre (2012)02 de enero - 08 de enero (2012)09 de enero - 15 de enero (2012)16 de enero - 22 de enero (2012)23 de enero - 29 de enero (2012)Tenga en cuenta que la primera línea (del 24 de diciembre al 30 de diciembre) es el final del año en curso (2012) y no el final del año pasado (2011).
Idealmente, quiero que se vea como
¿Algunas ideas? ¡¡Gracias!!