Saltar al contenido

¿Obtener el número de semana en el mes a partir de la fecha en PHP?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *