Sunteți pe pagina 1din 2

la verdad seores, 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 pginas con variadas soluciones) Alguna vez habeis pensado que muchos algoritmos se resuelven usandl el mismo mtodo intuitivo que ponemos en prctica 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 podra ser que quisieramos calcular la edad despues de que la fecha se enviara por formulario, deberamos 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 aos*/ $edad = date('Y') - substr($nac,0,4); /*si an no ha llegado el mes del cumpleaos, tiene la resta -1 si el mes es mayor devolvemos la resta de los aos, pero si coincide, miramos el dia si el dia actual es menor devolvemos la resta de los aos -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 sera.
//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 aos 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 haba hecho antes. por cierto, si una persona naci un 29 de febrero, los aos no biciestos cumple el da 1 de marzo. la verdad parece mas sencillo realizar unas tontas restas que andarse liancon el problema de los aos bisiestos anteriores a 1970 (1968 y anteriores)

S-ar putea să vă placă și