Cálculo de los días de un mes en PHP

Realizamos una función que calcula el número de días de un mes en PHP. Que podremos utilizar en el calendario en PHP.
A continuación vamos a ver una sencilla manera de codificar una función en PHP que realiza el cálculo de los días de un mes, teniendo en cuenta si el mes tiene 30 o 31 días así como si es febrero de un mes bisiesto, etc.

Esta función es UltimoDia() que hemos utilizado ya en alguna ocasión para el manual de calendario en PHP. Está creada de manera "artesanal", Aunque PHP actualmente contiene algunas funciones que nos pueden ayudar a hacer este mismo trabajo sin tener que realizar nosotros mismos los cálculos.

Nota: La función UltimoDia() hace un cálculo de cuál es el último día de un mes. La hemos utilizado con anterioridad (una versión distinta de la presente) para realizar el Manual del calendario en PHP.

No es necesario hacer un ciclo repetitivo para la función UltimoDia(), es un poco más simple de resolver.

Los meses 1,3,5,7,8,10,12 siempre tienen 31 días, los meses 4,6,9,11 siempre tienen 30 días, el único problema es el mes de febrero dependiendo del año puede tener 28 o 29 días, pero ese cálculo tampoco es dificil.

Aquí envío el código para la función UltimoDía(), que ojalá les sirva...

Nota: Por favor, leer los comentarios que han enviado otros visitantes de DesarrolloWeb.com que proponen códigos para hacer esta misma funcionalidad pero de una manera muchísimo más elegante, corta, sencilla y sin posibilidad de errores. Gracias a todas las personas que han comentado y aportado algo más a este artículo!!!!!

function UltimoDia($anho,$mes){
   if (((fmod($anho,4)==0) and (fmod($anho,100)!=0)) or (fmod($anho,400)==0)) {
       $dias_febrero = 29;
   } else {
       $dias_febrero = 28;
   }
   switch($mes) {
       case 01: return 31; break;
       case 02: return $dias_febrero; break;
       case 03: return 31; break;
       case 04: return 30; break;
       case 05: return 31; break;
       case 06: return 30; break;
       case 07: return 31; break;
       case 08: return 31; break;
       case 09: return 30; break;
       case 10: return 31; break;
       case 11: return 30; break;
       case 12: return 31; break;
   }
}

Autor

Héctor A. Pinto F

Ingeniero en Informática. Santiago de Chile.

Compartir

Comentarios

tisasia

26/8/2003
Con las siguientes lineas de codigo calculamos el primer y el ultimo dia de cada mes:

$first_of_month = mktime (0,0,0, $month, 1, $year);
$maxdays = date('t', $first_of_month);

y funciona para cualquier año y mes (incluidos bisiestos)

Salu2 a to2......

bricomaniaco

17/3/2004
como el año gregoriano es un poco más corto que el verdadero o año trópico, se suprimen tres bisiestos cada 400 años, en los años seculares no divisibles por 400, tales como 1700, 1800, 1900 y 2100. Tenedlo en cuenta en este tipo de algoritmos...

[Ph03n1X]

19/10/2004
Nunca está de más asegurarse que el servidor trabaja con el formato de fecha correcto y especificárselo con la siguiente línea:

setlocale (LC_TIME,"spanish");

Dany

02/8/2006
La verdad asi como asi no me funciono
uso PHP 5.1.4 y la funcion no devolvia ningun valor :S
la verdad no entendi por que...
tambien probe con mktime y el script se colgaba...
en fin para quienes les suceda lo mismo solucione el problema modificando este script de la sgte forma:

function UltimoDiaMes($anho,$mes){

if (((fmod($anho,4)==0) and (fmod($anho,100)!=0)) or (fmod($anho,400)==0)) {
$dias_febrero = 29;
} else {
$dias_febrero = 28;
}
$dias=31;
switch($mes) {
case 01: $dias = 31; break;
case 02: $dias = $dias_febrero; break;
case 03: $dias = 31; break;
case 04: $dias = 30; break;
case 05: $dias = 31; break;
case 06: $dias = 30; break;
case 07: $dias = 31; break;
case 08: $dias = 31; break;
case 09: $dias = 30; break;
case 10: $dias = 31; break;
case 11: $dias = 30; break;
case 12: $dias = 31; break;

}

return $dias;

}

las gracias van igual para quien escribio el articulo creo q fue Héctor A. Pinto F

salu2 Atte. Dany Jaque. Estudiante Informática UCT

pablo

02/7/2007
En mi opinión es mucho más profesional usar la función checkdate() que comprueba si una fecha es correcta, ya que lo anterior no sería válido para días bisiestos. Ejemplo:

$dia = 1;
while( checkdate($mes,$dia,$año) )
{
echo $dia."<br />";
$día++;
}

Que nos daría una lista de días del $mes y $año indicados.

Saludos,

Akira

05/12/2008
¡Qué zoquete! La función Date te informa directamente del número de días de un mes determinado. Parece mentira que te metas a enseñar antes de aprender tú mismo.

Dr. Trucho

30/4/2009
¿Año bisiesto?
Digo yo, que si en vez de escribir todo esto:
if (((fmod($anho,4)==0) and (fmod($anho,100)!=0)) or (fmod($anho,400)==0)) {
$dias_febrero = 29;
} else {
$dias_febrero = 28;
}
utilizamos:
if (date("L")==1) {
$dias_febrero = 29;
} else {
$dias_febrero = 28;
}

¿No sería más sencillo?

ricardo_v_r

23/12/2009
Chequen esta funcion
cal_days_in_month(1,$mes,$anno);
y da el numero de dias que tiene el mes de acuerdo al año proporcionado.

fxzabalam

03/3/2010
Agradecimiento
Excelente el tutorial, yo acabo de modificarlo para que desde mi base de datos mysql lea mis eventos y me los marque en el calendario, y todo funciona calidad.

Muchas gracias por esta gran ayuda!...

pedro

20/11/2010
calendario
ok estoy trabajando con Kumbia y no puedo hacer funcionar estos codigos si alguien me ayuda

johanes

03/4/2012
calculo de dias
function dia_semana ($fecha) {
$respuesta = new xajaxResponse();
$dia = substr ($fecha,0,2);
$mes = substr ($fecha,3,2);
$ano = substr ($fecha,6,4);
$diainicio = date("w", mktime(0, 0, 0, $mes, $dia, $ano));

//$rsp = " ";
//$rsp .= '<input name="dia" type="text" id="dia" style="font-size:14px" />';
$respuesta ->assign("apDiv119","innerHTML",$rsp);
$respuesta ->assign("dia","value", $diainicio);
return $respuesta;

}

con este codigo mande por medio de xajax a una etiqueta un input text al cual le di el valor del dia en que incia, o que te diga el mes año o dia lo que uno kiera