algoritmo para calcular la edad
la verdad señores, nunca imaginé ver tantos post para resolver algo tan secillo (en referencia a otro hilo que trataba este tema y que llego a tener 3 páginas con variadas soluciones)
Alguna vez habeis pensado que muchos algoritmos se resuelven usandl el mismo método intuitivo que ponemos en práctica en nuestras vidas?
Pues bien, sin tener k usar mktime o strtotime, y teniendo en cuenta que la fecha de nacimiento podria tomarse de la base de datos o podría ser que quisieramos calcular la edad despues de que la fecha se enviara por formulario, deberíamos tener una funcion como la siguiente:
/****calculo de la fecha de nacimiento (formato: yyyy-mm-dd)********/
function edad($nac)
{
/*en general la edad es la resta de los años*/
$edad = date('Y') - substr($nac,0,4);
/*si aún no ha llegado el mes del cumpleaños, tiene la resta -1
si el mes es mayor devolvemos la resta de los años, pero si coincide, miramos el dia
si el dia actual es menor devolvemos la resta de los años -1*/
if(date('m') < substr($nac,5,2)) return $edad - 1;
else if(date('m') == substr($nac,5,2))
{
if(date('d') < substr($nac,8,2)) return $edad - 1;
}
return $edad;
}
otra manera sería.
//tengo la fecha en milisegundos (en realidad toma la marca de tiempo $fecha 00:00:00
$date = strtotime($nac,time());
$now = time(); // salvo la marca de tiempo actual en milisegundos
$anyos = 0;
while($date < $now)
{
++$anyos;
$date = strtotime("+1 year",$date);
}
echo "La edad es $anyos";
Este tiene un problema, y es que las fechas relativas a años biciestos anteriores a 1970 salen mal.
por ello habria que hacer lo siguiente para tener la fecha de nacimiento correctamente
//tengo la fecha en milisegundos (en realidad toma la marca de tiempo $fecha 00:00:00
$date = strtotime($nac,time());
if($nac.substr(0,4) < 1970 && date('L',$date) == 1) $date = strtotime(-2 day,$date);
/*si la fecha es por ejemplo, 1968-06-08, al calcular los milisegundos, si intentamos obtener la fecha con date, devolveria 1968-06-09, por tanto recalculamos quitandole dos dias al tiempo en milisegundos, ya que ahora marca el dia 9 y al hacerle strtotime subira al dia 10 a la vez k le kitamos 2 dias, con lo que vuelve al dia 8*/
//ahora continuamos con lo mismo que se había hecho antes.
por cierto, si una persona nació un 29 de febrero, los años no biciestos cumple el día 1 de marzo.
la verdad parece mas sencillo realizar unas tontas restas que andarse liancon el problema de los años bisiestos anteriores a 1970 (1968 y anteriores)
- Inicie sesión o regístrese para enviar comentarios
- 4092 lecturas


Lo Bueno que tiene ese tema que mencionas es que ayuda a la practica de la programación (es lo que pienso), porque si vamos al caso como tu dices slimshdy con realizar una simple resta del año que naciste con el estamos nos muestra la edad.
Pero bueno siempre es bueno aprender algo, y gracias a este tipo de post nos podría ayudar para cualquier actividad.
saludos
anda, si está aquí mismo: http://www.esdebian.org/foro/29566/algoritmo-calcular-edad
que sería de nosotros sin el buscador ¿verdad?
[modo irónico on]anda si es que yo no buscaba como resolverlo, solo responder en un tema que se cerró por inactividad, mira tu que cosassss!!!!!![modo irónico off]
en fin a este tipo de comentarios mejor darle la importancia que merecen: NINGUNA
[modo irónico on]sabes que pasa es que soy tan especial que por un lado estoy inmerso en el mundo de la programación pero por otro no se usar un buscador, herramienta que habré diseñado 200.000 veces [modo irónico off]
en cuanto a lo de practicar, si es bueno ver como hacer las cosas de muchas maneras diferentes, pero al final todo se reduce a la busqueda del método mas sencillo y ese es una resta y unos pocos if, ya que refleja el método que cualquier persona usa para saber que edad tienes cuando lecdices tu fecha de nacimiento.
En esa línea ha ido tb mi mensaje aportando una solución alternativa, es cuestión de gustos, pero el segundo método es más útil si vamos a contar meses (el algoritmo cambiaria claro)
[modo irónico on]anda si es que yo no buscaba como resolverlo, solo responder en un tema que se cerró por inactividad, mira tu que cosassss!!!!!![modo irónico off]
en fin a este tipo de comentarios mejor darle la importancia que merecen: NINGUNA
¿quien ha dicho lo contrario?, simplemente he indicado donde estaba tan inimaginable hilo al que citas pero no enlazas.
[modo irónico on]sabes que pasa es que soy tan especial que por un lado estoy inmerso en el mundo de la programación pero por otro no se usar un buscador, herramienta que habré diseñado 200.000 veces [modo irónico off]
vaya, debes ser el único que lo hace...
En esa línea ha ido tb mi mensaje aportando una solución alternativa, es cuestión de gustos, pero el segundo método es más útil si vamos a contar meses (el algoritmo cambiaria claro)
Se agradece tu aportación
Por cierto, por favor, no utilices abreviaturas sms
[modo irónico on]sabes que pasa es que soy tan especial que por un lado estoy inmerso en el mundo de la programación pero por otro no se usar un buscador, herramienta que habré diseñado 200.000 veces [modo irónico off]
¿200.000 veces? pues sí que eres especial,sí.
Entonces... según esto:
en cuanto a lo de practicar, si es bueno ver como hacer las cosas de muchas maneras diferentes, pero al final todo se reduce a la busqueda del método mas sencillo .
¿He de suponer que lo has hecho mal 199.999 veces hasta que has encontrado el método más sencillo?
Pues sí, tienes razón, eres muy especial. No creo que haya nadie en el mundo que pueda hacerlo mal 199.999 veces sin dejarlo por imposible. Muchas felicidades por tu perseverancia.