Foros del Web » Programando para Internet » PHP »

Calcular edad actual

Estas en el tema de Calcular edad actual en el foro de PHP en Foros del Web. Hola a todos!!, necesito calcular la edad actual a partir de una fecha de nacimiento. He visto algunas funciones y no hacen bien el cálculo ...
  #1 (permalink)  
Antiguo 03/12/2003, 17:11
 
Fecha de Ingreso: octubre-2003
Mensajes: 134
Antigüedad: 20 años, 6 meses
Puntos: 0
Calcular edad actual

Hola a todos!!, necesito calcular la edad actual a partir de una fecha de nacimiento.

He visto algunas funciones y no hacen bien el cálculo , inclusive vi la función que está en el hilo:

http://www.forosdelweb.com/showthre...echa+nacimiento

y tampoco funciona para todas las fechas de nacimiento, ya que lo comprobé ingresando varias fechas de nacimiento y sólo con algunas da el resultado correcto (traté de modificar algunas funciones que encontré y no pude). Por favor ayúdenme, es muy importante para mi!!!

yuki27
  #2 (permalink)  
Antiguo 03/12/2003, 18:05
Avatar de Maycol  
Fecha de Ingreso: diciembre-2001
Ubicación: Ávila (España)
Mensajes: 539
Antigüedad: 22 años, 3 meses
Puntos: 0
Esta función es la que uso yo, la cree yo, y es valida para fechas en formato timestamp, pero con que se modifique las 4 primeras lineas se podria hacer para formato numerico en fecha normal...

Código PHP:
function edad($stamp){
$c date("Y",$stamp);
$b date("m",$stamp);
$a date("d",$stamp);

$anos date("Y")-$c;

if(
date("m")-$b 0){
}elseif(
date("m")-$b == 0){
    if(
date("d")-$a <= 0){
        
$anos $anos-1;
    }
}else{
    
$anos $anos-1;
}
return 
$anos;

__________________
Zepsilon.com
Diseño e imaginacion
  #3 (permalink)  
Antiguo 04/12/2003, 08:51
 
Fecha de Ingreso: octubre-2003
Mensajes: 134
Antigüedad: 20 años, 6 meses
Puntos: 0
Problemita!!!!

Hola Mycol!!!

Gracias por tu respuesta, pero no me funcionó.

Por ejemplo la llamo con 1990-01-01 y me da edad=33, o con 1986-05-06 también me da una edad equivocada, etc.

Si tienes algo que me pueda ayudar de ante mano muchas gracias.

yuki27
  #4 (permalink)  
Antiguo 05/12/2003, 05:59
Avatar de eoes  
Fecha de Ingreso: diciembre-2003
Ubicación: Puerto Ordaz
Mensajes: 78
Antigüedad: 20 años, 4 meses
Puntos: 0
No la he probado pruebala y me dices.
__________________________________________________ __
PHP Code

Esta función está escrita en PHP del 4.0 en adelanta y calcula la edad de una persona tomando su fecha de nacimiento de una base de datos mysql en formato aaaa/mm/dd
Descripcion:Esta función está escrita en PHP del 4.0 en adelanta y calcula la edad de una persona tomando su fecha de nacimiento de una base de datos mysql en formato aaaa/mm/dd

Lenguaje: PHP

Enviado por Haboc

Codigo Fuente
Copiar los codigos y pegar

function edad($fecha_nac){
//Esta funcion toma una fecha de nacimiento
//desde una base de datos mysql
//en formato aaaa/mm/dd y calcula la edad en números enteros

$dia=date("j");
$mes=date("n");
$anno=date("Y");

//descomponer fecha de nacimiento
$dia_nac=substr($fecha_nac, 8, 2);
$mes_nac=substr($fecha_nac, 5, 2);
$anno_nac=substr($fecha_nac, 0, 4);


if($mes_nac>$mes){
$calc_edad= $anno-$anno_nac-1;
}else{
if($mes==$mes_nac AND $dia_nac>$dia){
$calc_edad= $anno-$anno_nac-1;
}else{
$calc_edad= $anno-$anno_nac;
}
}
return $calc_edad;
}





Codigo perteneciente a Lawebdelprogramador
__________________
Fran Ros.
  #5 (permalink)  
Antiguo 05/12/2003, 06:24
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

El codigo de Maycol funciona ... si le pasas el parametro en el formato correcto. Tienes que pasarle un timestamp, no la fecha en una cadena. Puedes usar la funcion strtotime() (www.php.net/strtotime) para pasar de la cadena a timestamp.

Asi, con el codigo de Maycol, la llamada seria:
Código PHP:
echo edad(strtotime('1990-01-01')); 
Por cierto, el codigo que ha puesto eoes simplemente soluciona esto cogiendo los trozos de la cadena que le pasas.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 06/12/2003, 07:51
 
Fecha de Ingreso: octubre-2003
Mensajes: 134
Antigüedad: 20 años, 6 meses
Puntos: 0
Funciona pero...

Hola!!! lo primero es agradecer a eoes y a josemi por su ayuda.

Lo de eoes funciona pero no siempre (este fue el código que motivó que escribiera al foro, lo obtuve del hilo que indiqué en la consulta realizada), lo probé con muchas fechas y en la mayoría de ellas funciona pero hay algunas fechas con las cuales no da la edad actual, por ejemplo:

FNacimiento:

1990-01-01=13 -- correcto
1990-02-02=12 -- incorrecto
1990-02-09=12 --incorrecto
1990-11-09=13 -- correcto
1986-02-05=16 -- incorrecto etc, etc.

Lo de josemi funciona corectamente (de todas las fechas señaladas anteriormente - junto con muchaass mass) PERO cuando le paso la fecha de hoy no le suma un año, es decir:

1986-12-05=17 -- correcto
1986-12-06=16 -- incorrecto (cumple año hoy y no lo suma)
1986-12-07=16 -- correcto

1987-12-05=16 -- correcto
1987-12-06=15 -- incorrecto
1987-12-06=15 -- correcto.

He tratado de hacer un función, pero creo que no soy diestr en esta materia. En realidad ya no se donde buscar más, tendré que seguir intentando dar con la solución.

Así que si algún alma caritativa puede ayudarme, se lo agradecería muchísimo, ya que he tratado de dar (y crear) con alguna función que haga este tan simple cálculo de edad y que para mi se ha convertido en una pesadilla

Gracias de ante mano.

yuki27
  #7 (permalink)  
Antiguo 06/12/2003, 16:51
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hombre, podria ser una duda filosofica el determinar que edad tienes hoy si cumples años hoy.

Pero bueno, si eres de los que crees que si cumples años hoy tienes la misma edad que mañana (es decir, tienes prisa por envejecer), creo que simplemente modificando el codigo de Maycol en este trozo:
Código PHP:
}elseif(date("m")-$b == 0){

    if(
date("d")-$a <= 0){

        
$anos $anos-1;

    } 
y poniendo en su lugar
Código PHP:
}elseif(date("m")-$b == 0){

    if(
date("d")-$a 0){

        
$anos $anos-1;

    } 
creo que conseguiremos el efecto que quieres.

Si te fijas, en el codigo original quitaba un año si el dia actual era menor o igual al dia de la fecha de nacimiento: date("d")-$a <= 0 o lo que es lo mismo date("d") <= $a.

Y ahora lo dejo como date("d")-$a < 0 o lo que es lo mismo date("d") < $a.

Pero ya te advierto que es una modificacion que he hecho de cabeza, sin probarlo. Ejecuta otra vez la bateria de pruebas con este cambio, y nos comentas si te sirve.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 12/12/2003, 11:37
 
Fecha de Ingreso: octubre-2003
Mensajes: 134
Antigüedad: 20 años, 6 meses
Puntos: 0
Funcionó!!!

Hola Josemi

Respecto a querer envejecer rápidamente no es así, pero para lo que estoy haciendo necesitaba reflejar que si entro una fecha de nacimiento que cumple año me calculara la edad a hoy dia, ya que de acuerdo a la edad actual debo asignar un puntaje.

Pero el motivo de esta respuesta es para darte las GRACIAS pues con la ayudita que me enviaste funcionó Perfectamente.

Además le doy las gracias a Maycol, y a eoes por sus respuestas, me sirvieron mucho!!


Saludos

yuki27
  #9 (permalink)  
Antiguo 09/08/2004, 20:10
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Hola,

Probé la función de Maycol y me funcionó muy bien y a la primera, sin embargo, hoy 9 de agosto de 2004, puse un registro fechado el 17 de Marzo de 1953 (1953-03-17 en un campo date de mysql) y el fulano debiera tener 51 años. No obstante, marca 34.

Cualquier registro anterior a 1970 que ponga seguirá teniendo 34 (ojalá así pasara en la vida real :D)

¿Alguna idea de qué pasa?

El código es el siguiente:

Código PHP:
//Para la función

function edad($stamp){ 
    
$stamp strtotime($stamp);
    
$c date("Y",$stamp); 
    
$b date("m",$stamp); 
    
$a date("d",$stamp); 
    
    
$anos date("Y")-$c
    
    if(
date("m")-$b 0){ 
    }elseif(
date("m")-$b == 0){ 
        if(
date("d")-$a 0){ 
            
$anos $anos-1
        } 
    }else{ 
        
$anos $anos-1
    } 
    return 
$anos



//El valor en la DB está en formato YYYY-MM-DD
//Pero como le añadí a la función la línea: $stamp = strtotime($stamp); 
//le pasa el valor en el formato correcto

//la uso así:
fecha($recordset['fecha']); 
Cualquier ayuda se agradece.

Saludos!

PD. Según www.php.net/strtotime están soportadas las fechas desde 13 de dic. de 1901 hasta el 19 de enero de 2038... así que por ahí no debe ser la cosa
  #10 (permalink)  
Antiguo 09/08/2004, 20:19
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Si es para hacer cálculos con datos de la BD (MySQL), mejor hacerlo directamete con el SQL:
Cita:
Iniciado por manual_de_mysql
Código:
mysql> SELECT name, birth, CURDATE(),
    -> (YEAR(CURDATE())-YEAR(birth))
    -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
    -> AS age
    -> FROM pet;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
+----------+------------+------------+------+
Como se ve.. con una ¿simple? consulta podemos obtener la edad (age) directamente.

Este es el enlace al manual de MySQL de donde cité el ejemplo:
http://dev.mysql.com/doc/mysql/en/Da...culations.html

Saludos

Última edición por jpinedo; 09/08/2004 a las 20:20
  #11 (permalink)  
Antiguo 09/08/2004, 20:43
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Gracias jpinedo!!!

Funcionó de las mil maravillas.

No cabe duda que desde el MySQL se pueden resolver tantos problemas...

Bueno, gracias de nuevo :)
  #12 (permalink)  
Antiguo 09/08/2004, 21:11
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
En realidad sí... por eso es bueno dar todo la información posible sobre los problemas que se tienen. Si no hubieras puesto que era para MySQL yo habría seguido insistiendo en la función desde php...

Saludos
  #13 (permalink)  
Antiguo 29/09/2004, 21:44
Avatar de fmmeson  
Fecha de Ingreso: enero-2002
Ubicación: Tucuman
Mensajes: 401
Antigüedad: 22 años, 2 meses
Puntos: 2
perdon, como seria modificando esa consulta solo para q muestre usuarios q tienen entre 10 y 15 años, se lo agradeceria muchisimo

Saludossss
__________________
Lo que se hace por AMOR esta mas allá del BIEN y del MAL - Friedrich Nietzsche
http://www.hispanogeek.com.ar
Desarrollador IT -
  #14 (permalink)  
Antiguo 30/09/2004, 19:08
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Cita:
Iniciado por fmmeson
perdon, como seria modificando esa consulta solo para q muestre usuarios q tienen entre 10 y 15 años, se lo agradeceria muchisimo
Simplemente agregando la condición en la cláusula WHERE.
O sea, le agregas:
WHERE age <= 15 AND age >=10;

Saludos
  #15 (permalink)  
Antiguo 30/09/2004, 23:21
Avatar de fmmeson  
Fecha de Ingreso: enero-2002
Ubicación: Tucuman
Mensajes: 401
Antigüedad: 22 años, 2 meses
Puntos: 2
jpinedo, gracias por contestar pero yo ya habia probado eso pero me dice que la columna "age" no existe pues es un "alias" quisiera saber como solucionar esto.

Desde ya muchas gracias!!!
__________________
Lo que se hace por AMOR esta mas allá del BIEN y del MAL - Friedrich Nietzsche
http://www.hispanogeek.com.ar
Desarrollador IT -
  #16 (permalink)  
Antiguo 30/09/2004, 23:34
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Ups... creo que me apresuré a responder entonces...
Busca sobre la cláusula HAVING. Supongo que eso lo resolverá.

Saludos
  #17 (permalink)  
Antiguo 01/10/2004, 05:52
Avatar de fmmeson  
Fecha de Ingreso: enero-2002
Ubicación: Tucuman
Mensajes: 401
Antigüedad: 22 años, 2 meses
Puntos: 2
gracias!

jpinedo, gracias por contestar, ya me das por lo menos una idea por donde seguir investigado
__________________
Lo que se hace por AMOR esta mas allá del BIEN y del MAL - Friedrich Nietzsche
http://www.hispanogeek.com.ar
Desarrollador IT -
  #18 (permalink)  
Antiguo 20/04/2006, 23:22
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
Como hago para poner esa función dentro de otra función o mejor dicho, para que la edad la calcule teniendo el dato "$nacimiento", donde nacimiento tiene el formato 1976-09-27 (obtenido de una base de datos mysql)
Hacerlo con una función no puedo (como en los ejemplos) porque quiero que esté dentro de una función que ya tengo y en esa función que imprime varias cosas, quiero que imprima la edad en lugar de la fecha de nacimiento
  #19 (permalink)  
Antiguo 21/04/2006, 03:06
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Usa la siguiente función. Tú le pasas como parámetro la fecha de nacimiento en el formato aaaa-mm-dd y te regresa la edad del individuo.

Código PHP:
<?
function obtener_edad($nacimiento){
    
//restamos los años (año actual - año cumpleaños)
     
$edad date("Y") - ereg_replace("^(.{4}).*","\\1",$nacimiento);

     
//si pasamos de año, pero aún no cumplimos años, resta 1
     
if( date("m-d") < ereg_replace(".*(.{5})$","\\1",$nacimiento) ) $edad--;

     return 
$edad;
    }
//endfunction

?>
Ejemplo:

Código:
2006-04-21     - Fecha Actual
1953-03-17     - Fecha Nacimiento
53             - Edad
Como verás, es la misma función de Mr. JPinedo. Aunque la solución de sacarlo directamente de la DB es mucho más elegante.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #20 (permalink)  
Antiguo 21/04/2006, 14:52
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
muchas gracias uamistad, me anduvo perfecto
  #21 (permalink)  
Antiguo 21/09/2008, 13:53
 
Fecha de Ingreso: septiembre-2008
Mensajes: 1
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Calcular edad actual - Por favor ayuda!!

Hola, he programado esta función a partir de la que propuso Maycol, calcula la edad y puedes pasarle la fecha como quieras, en formato string o en marca de tiempo (timestamp), la estoy usando para parsear los valores datetime de mysql:

Código PHP:
/*
Function: Get_Edad(date)
    
Desc: Calcula la edad de una persona 
    a partir de su fecha de nacimiento.
        
Return: Int Edad
         0 si no se pudo calcular    
*/
function Get_Edad($date)
{
    
// Si no es una marca de tiempo intentamos convertirla
    
if( !is_integer($date) )
    {
         if( 
strtotime$date ) <> -// Si es diferente a -1 convertimos la fecha
         
{
             
$date strtotime$date );
         }
         else 
// No parece ser una fecha válida
         
{
             return 
0;
         }
    }
    
    
// Procesamos la marca de tiempo
    
$ano date("Y"$date);
    
$mes date("m"$date);
    
$dia date("d"$date);
    
    
// Calculamos los años que tiene
    
$anos date("Y") - $ano;
    
    if( 
date("m") > $mes // Si el mes es superior, tenemos los años calculados anteriormente
    
{
        return 
$anos;
    } 
    elseif( 
date("m") < $mes // Si el mes es inferior tenemos tenemos un año menos
    
{
        return 
$anos 1;
    }
    else 
// Este mes es su cumpleaños
    
{
        if( 
date("d") > $dia // Si el día es superior tenemos los años calculados anteriormente
        
{
            return 
$anos;
        } 
        elseif( 
date("d") < $dia // Si el día es inferior tenemos  un año menos
        
{
            return 
$anos -1;
        }
        else 
// Hoy es su cumpleaños
        
{
            return 
$anos;
        }
    }

Os la dejo aquí por si le sirve a alguien, creo que está suficientemente explicada para los novatos.

Salu2
Cristian
  #22 (permalink)  
Antiguo 21/09/2008, 14:05
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Respuesta: Calcular edad actual

OT - Aviso: Y por cosas como estas son por las que no creo conveniente cerrar temas solo por el hecho de ser viejos.
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 11:16.