Otras funciones de la librería del calendario

  • Por
Vemos otras funciones de manejo de fechas que utilizamos en el ejecicio del Calendario PHP.
Hemos avanzado bastante ya en la práctica del Calendario PHP. Anteriormente hemos visto las funciones más importantes que implementan nuestro calendario, pero hay otras que serán importantes para completar el trabajo.

En este capítulo documentaremos las funciones que venimos utilizando para la creación del calendario, que se encuentran dentro de la librería calendario.php, al igual que las funciones de mostrar_calendario() y formularioCalendario().

Función calcula_numero_dia_semana($dia,$mes,$ano)

Esta función calcula el número de día de la semana de una fecha indicada por parámetro. El número de día de la semana que devuelve corresponde con 0 en el caso de que la fecha sea un lunes, 1 en caso de ser martes, y así hasta llegar al 6, que corresponde con el domingo.

La fecha la recibe la función con el valor del día, mes y año, pasado en variables independientes. El código es el siguiente:

function calcula_numero_dia_semana($dia,$mes,$ano){
    $numerodiasemana = date('w', mktime(0,0,0,$mes,$dia,$ano));
    if ($numerodiasemana == 0)
       $numerodiasemana = 6;
    else
       $numerodiasemana--;
    return $numerodiasemana;
}


Primero obtenemos el número de día de la semana que nos ofrece PHP a través de la función date(). Como PHP, al igual que la mayoría de los sistemas, está pensado en inglés, y para él, el numero de la semana correspondiente a domingo es el 0, el del lunes es el 1. Por eso tenemos unas líneas de código para convertir el número de la semana del "inglés al español".

Función ultimoDia($mes,$ano)

Sirve para devolver el último día de un mes y año indicados por parámetro. El último día del mes se refiere al número de días que tiene un mes. Por ejemplo en enero 31, febrero 28 ó 29, ... diciembre 31.

function ultimoDia($mes,$ano){
    $ultimo_dia=28;
    while (checkdate($mes,$ultimo_dia + 1,$ano)){
       $ultimo_dia++;
    }
    return $ultimo_dia;
}


Para hallar ese dato vamos a utilizar una pequeña treta que consiste en suponer que el mes tiene 28 días como mínimo y empezar a validar cada uno de los días siguientes hasta que la fecha que estamos construyendo sea incorrecta. En ese caso querrá decir que el número de días es 1 menos que los que tenemos en el momento de fallar la fecha.

Por poner un ejemplo, para enero, empezaríamos por 28. Entonces validamos el día siguiente (29). Como es correcta la fecha "29 de enero de una año cualquiera", acumulamos 1 en la variable $ultimo_dia para situarnos en esa fecha válida. Posteriormente, validamos el 30 de enero, que también es correcta, entonces volvemos a acumular 1 en la variable para situarnos en esa nueva fecha correcta... así hasta que intentemos validar la fecha "32 de enero" que será la primera que falle. Entonces paramos el bucle y dejamos de acumular a la fecha que teníamos, que era válida. Esto funciona bien para cualquier mes, incluso para febrero, sea el año bisiesto o no.

Función dame_nombre_mes($mes)

Devuelve el nombre del mes que recibe como número en el parámetro. Ejemplo sencillo donde los haya, sólo tiene una estructura switch que asigna un mombre de mes para cada valor del parámetro.

function dame_nombre_mes($mes){
    switch ($mes){
       case 1:
          $nombre_mes="Enero";
          break;
       case 2:
          $nombre_mes="Febrero";
          break;
       case 3:
          $nombre_mes="Marzo";
          break;
       case 4:
          $nombre_mes="Abril";
          break;
       case 5:
          $nombre_mes="Mayo";
          break;
       case 6:
          $nombre_mes="Junio";
          break;
       case 7:
          $nombre_mes="Julio";
          break;
       case 8:
          $nombre_mes="Agosto";
          break;
       case 9:
          $nombre_mes="Septiembre";
          break;
       case 10:
          $nombre_mes="Octubre";
          break;
       case 11:
          $nombre_mes="Noviembre";
          break;
       case 12:
          $nombre_mes="Diciembre";
          break;
    }
    return $nombre_mes;
}


Con esto hemos acabado el ejercicio del calendario PHP. Aunque seguro que habrá hecho falta un esfuerzo por vuestra parte, esperamos que las explicaciones hayan sido suficientes y podáis entenderlo bien.

Para acabar, dejamos un enlace para Ver el calendario en funcionamiento.

Nota: Hasta aquí hemos construido un calendario más o menos funcional, que permite mostrar cualquier mes y año. Claro que para ponerlo en producción seguramente necesitaremos trabajar un poco más para hacer cosas como que se pueda seleccionar un día, se marquen los días festivos con otro color, etc. En los próximos artículos del Manual del Calendario PHP abordaremos algunas de las necesidades que los desarrolladores se puedan plantear para usar este calendario.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Fernando Cuadrado

28/1/2004
El break, no debe utilizarse para frenar la funcion, el recurso existe únicamente como alternativa, un algoritmo debe ejecutarse hasta el final de su cometido. La funcion Switch accede una sola vez al case, por lo que el break esta redundante.

Quizá hubiese sido mas práctico:
function dame_nombre_mes($mes){

$meses = array("1" => "Enero", "2" => "Febrero", "3" => "Marzo", "4" => "Abril", "5" => "Mayo", "6" => "Junio", "7" => "Julio", "8" => "Agosto", "9" => "Septiembre", "10" => "Octubre", "11" => "Noviembre", "12" => "Diciembre",);

return $meses[$mes];
}

Lo describo aqui en una funcion pero con la creacion del array de forma independiente bastaria.
Hago esta aclaracion porque me parece interesante el script en su totalidad, me a servido y agradezco a quien se tomo el tiempo de pensarlo.

N4x0

08/7/2004
También se podría definir un array escalar, cuyo primer indice no valdria (por que sería el mes 0).

Juan Pablo

14/4/2005
La funcion ultimo dia se puede remplazar por algo asi
date('d-m-y',strtotime('1 $month $year -1 day')) y te va a devolver el ultimo dia del mes anterior :)

Gustavo

13/7/2006
Si este if da verdadero es año bisiesto:
if (((fmod($anho,4)==0) && (fmod($anho,100)!=0)) || (fmod($anho,400)==0))

usuario_borrado_767574

13/10/2011
función ultimoDia($mes,$ano)
bastaría hacer
$diasMes = date('t', mktime(0,0,0,$mes,$dia,$ano));
pero con el $dia puesto a 1 por ejemplo, si está a nul devuelve valor incorrecto.

LitzCOL

28/12/2012
Que buen código
Gracias Miguel por estos ejemplos prácticos, y aunque estamos en el 2012 y el articulo tiene casi una decada, es totalmente funcional y útil...

isacoft

14/5/2013
mostrar eventos
Como podríamos hacer para que mostrara eventos que tenemos en una base de datos?. Que los dias en los que haya evento aparezcan de algun color. Gracias