Solución:
Creo que esta relación debería ser cierta y ser útil:
Week of the month = Week of the year - Week of the year of first day of month + 1
También debemos asegurarnos de que las semanas “superpuestas” del año anterior se manejen correctamente; si el 1 de enero está en la semana 52 o 53, debe contarse como la semana 0. (Una versión anterior de esta respuesta no lo hizo).
function weekOfMonth($date) {
//Get the first day of the month.
$firstOfMonth = strtotime(date("Y-m-01", $date));
//Apply above formula.
return weekOfYear($date) - weekOfYear($firstOfMonth) + 1;
}
function weekOfYear($date) {
$weekOfYear = intval(date("W", $date));
if (date('n', $date) == "1" && $weekOfYear > 51) {
// It's the last week of the previos year.
$weekOfYear = 0;
}
return $weekOfYear;
}
// A few test cases.
echo weekOfMonth(strtotime("2020-04-12")) . " "; // 2
echo weekOfMonth(strtotime("2020-12-31")) . " "; // 5
echo weekOfMonth(strtotime("2020-01-02")) . " "; // 1
echo weekOfMonth(strtotime("2021-01-28")) . " "; // 5
Para obtener semanas que comiencen con el domingo, simplemente reemplace date("W", ...)
con strftime("%U", ...)
.
Puede usar la función a continuación, completamente comentada:
/**
* Returns the number of week in a month for the specified date.
*
* @param string $date
* @return int
*/
function weekOfMonth($date) {
// estract date parts
list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date)));
// current week, min 1
$w = 1;
// for each day since the start of the month
for ($i = 1; $i <= $d; ++$i) {
// if that day was a sunday and is not the first day of month
if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) {
// increment current week
++$w;
}
}
// now return
return $w;
}
La forma correcta es
function weekOfMonth($date) {
$firstOfMonth = date("Y-m-01", strtotime($date));
return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth)));
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)