Nuestros mejores investigadores han agotado sus reservas de café, en su búsqueda noche y día por la solución, hasta que Enrique halló la respuesta en GitHub por lo tanto hoy la compartimos con nosotros.
Solución:
Creo que esta relación debería ser true 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 semana 0. (Una versión anterior de esta respuesta no pudo hacer esto).
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 comienzan 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)));
Si para ti ha sido útil nuestro artículo, sería de mucha ayuda si lo compartes con otros seniors de este modo contrubuyes a extender nuestro contenido.