Conocer el numero de la semana dentro de determinado mes, partiendo de una fecha determinada con PHP

Últimamente he estado trabajando en una clase para generar calendarios semanales y que he publicado en phpclasses.org. Cuando se apruebe la clase publicaré el enlace para su descarga.

La función que mas me ha costado desarrollar ha sido la destinada a extraer en que semana (1ª, 2ª …) nos encontramos dentro de determinado mes, partiendo de una fecha determinada.

La verdad es que estuve buscando por internet algo que me pudiera servir pero no encontré nada, así que termine por tener que buscarme la vida y creo que el resultado es satisfactorio. Aquí lo comparto con vosotros. Espero que os sirva de ayuda.

function numberOfWeek ($dia, $mes, $ano) {

//generamos la fecha para el día 1 del mes y año especificado
$fecha = mktime ($hora, $min, $seg, $mes, 1, $ano);

/*
El número de semana en el que nos encontramos será igual a:
– el día espeficado +
– el número de día de la semana (lunes, martes …) al que se corresponde la fecha almacenada en $fecha – 1
– entre 7 días que tiene la semana.

Quedando la fórmula de la siguiente manera …
*/
$numberOfWeek = ceil (($dia + (date (“w”, $fecha)-1)) / 7);

return $numberOfWeek;
}

//mostramos en pantalla el resultado devuelto por la función

echo numberOfWeek ("8","9", "2009");

Anuncios

3 Responses to Conocer el numero de la semana dentro de determinado mes, partiendo de una fecha determinada con PHP

  1. […] Articulo Indexado en la Blogosfera de Sysmaya Últimamente he estado trabajando en una clase para generar calendarios semanales y que he publicado en phpclasses.org. Cuando se apruebe la clase publicaré el enlace para su descarga. La función que mas me ha costado desarrollar ha si Últimamente he .. […]

  2. Nicolás Aros Fuentes dice:

    Compadre, felicitaciones por el código, me estuve calentando la cabeza hartos días y finalmente empecé a buscar por internet sin muchos resultados, esta función realiza su labor perfectamente pero tiene un pequeño detalle en el día 1 del mes (empieza a contar como semana 1 el día 2, si uno consulta por el primero de un mes tira como semana 0) y te aviso porque estaba haciendole testeos y me fijé en eso. Observando que sólo ocurre en el día numero 1+7x le puse una solución parche, la cual es:

    if($dia == 1 || $dia == 8 || $dia == 15 || $dia == 22 || $dia == 29)
    {
    $numberOfWeek++;
    }

    si encontraras una forma de arreglarla menos barbárica que la mía te agradecería que me la informaras.

    Saludos

  3. Cincibeles dice:

    woow, está increible!

    Creo haber resuelto el problema que menciona Nicolás.
    Además, agregué un cuarto parámetro (booleano) a la función que sirve para activar un valor único por semana. La ultima semana de cada mes se hereda al mes siguiente si es que comparten la semana.

    function numberOfWeek ($dia, $mes, $ano, $unico=false) {

    //generamos la fecha para el día 1 del mes y año especificado
    $fecha = mktime ($hora, $min, $seg, $mes, 1, $ano);

    /*
    Da la ultima semana del mes si ésta está compartida con el mes siguiente
    Por ejemplo el Martes 28 de Febrero del año 2012 será la primera semana de Marzo
    Asi hay un valor unico semana-mes-año para cada semana del año
    */
    if($unico!==false){
    //sumanos los segundos necesarios para que la fecha proporcionada en los parametros llege a Sábado
    $actual=mktime ($hora, $min, $seg, $mes, $dia, $ano);
    $paraSabado = $actual+(5-date(“w”, $actual))*86400;
    //si el mes proporcionado en los parametros es distinto que el de la nueva fecha en sábado
    if((int)$mes != (int)date(‘m’,$paraSabado)) {
    $mes=(int)date(‘m’,$paraSabado);
    $ano=(int)date(‘Y’,$paraSabado);
    return array(0,$mes,$ano);
    }
    }

    /*
    El número de semana en el que nos encontramos será igual a:
    – el día espeficado – 1 (para que el primer día sea cero) +
    – el número de día de la semana (lunes, martes …) al que se corresponde la fecha almacenada en $fecha
    – entre 7 días que tiene la semana.
    Quedando la fórmula de la siguiente manera …
    */
    $numberOfWeek = floor (((int)$dia – 1 + date (“w”, $fecha)) / 7);
    return array($numberOfWeek,$mes,$ano);
    }

    Devuelve un array con el numero de semana, el mes y el año.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: