Hola. Para una aplicación necesité obtener la edad con el formato de "Tengo x años, x meses y x días" y lo publico aquí, por si alguien lo necesita. Estoy convencido que esto ya existe en la red (de hecho, la base la tomé de algún sitio que ahora no recuerdo), pero como no lo encontré, lo publico en este estupendo foro.
Está basado en restar los años, meses y días, y se tiene en cuenta que tanto los meses como los días podrían dar negativo, para reajustarlos.
Código PHP:
<?php
$fecha_de_nacimiento = "1948-05-11";
$fecha_actual = date ("Y-m-d");
//$fecha_actual = date ("2006-03-05"); //para pruebas
echo "<br>Hoy es $fecha_actual";
echo "<br>Naciste el $fecha_de_nacimiento";
// separamos en partes las fechas
$array_nacimiento = explode ( "-", $fecha_de_nacimiento );
$array_actual = explode ( "-", $fecha_actual );
$anos = $array_actual[0] - $array_nacimiento[0]; // calculamos años
$meses = $array_actual[1] - $array_nacimiento[1]; // calculamos meses
$dias = $array_actual[2] - $array_nacimiento[2]; // calculamos días
//ajuste de posible negativo en $días
if ($dias < 0)
{
--$meses;
//ahora hay que sumar a $dias los dias que tiene el mes anterior de la fecha actual
switch ($array_actual[1]) {
case 1: $dias_mes_anterior=31; break;
case 2: $dias_mes_anterior=31; break;
case 3:
if (bisiesto($array_actual[0]))
{
$dias_mes_anterior=29; break;
} else {
$dias_mes_anterior=28; break;
}
case 4: $dias_mes_anterior=31; break;
case 5: $dias_mes_anterior=30; break;
case 6: $dias_mes_anterior=31; break;
case 7: $dias_mes_anterior=30; break;
case 8: $dias_mes_anterior=31; break;
case 9: $dias_mes_anterior=31; break;
case 10: $dias_mes_anterior=30; break;
case 11: $dias_mes_anterior=31; break;
case 12: $dias_mes_anterior=30; break;
}
$dias=$dias + $dias_mes_anterior;
}
//ajuste de posible negativo en $meses
if ($meses < 0)
{
--$anos;
$meses=$meses + 12;
}
echo "<br>Tu edad es: $anos años con $meses meses y $dias días";
function bisiesto($anio_actual){
$bisiesto=false;
//probamos si el mes de febrero del año actual tiene 29 días
if (checkdate(2,29,$anio_actual))
{
$bisiesto=true;
}
return $bisiesto;
}
?>
Un saludo.