PHP calcular edad

160

Estoy buscando una manera de calcular la edad de una persona, dada su fecha de nacimiento en el formato dd / mm / aaaa.

Estaba usando la siguiente función que funcionó bien durante varios meses hasta que algún tipo de falla causó que el ciclo while nunca terminara y detuviera todo el sitio. Dado que hay casi 100,000 DOB que pasan por esta función varias veces al día, es difícil precisar qué estaba causando esto.

¿Alguien tiene una forma más confiable de calcular la edad?

//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();

$age = 0;
while( $tdate > $dob = strtotime('+1 year', $dob))
{
    ++$age;
}
return $age;

EDITAR: esta función parece funcionar bien algunas veces, pero devuelve "40" para un DOB del 14/09/1986

return floor((time() - strtotime($birthdayDate))/31556926);
stef
fuente

Respuestas:

192

Esto funciona bien

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "12/17/1983";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
  echo "Age is:" . $age;
?>
Sudhir Bastakoti
fuente
1
De acuerdo, en algún momento para ese formato tenemos que usar mktime(). parece que PHP calculó mal strtotime()con ese formato.
GusDeCooL
30
PHP strtotimeentiende perfectamente los formatos de fecha, no necesita preocuparse: Dates in the m/d/y or d-m-y formats are disambiguated by looking at the separator between the various components: if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European d-m-y format is assumed. php.net/manual/en/function.strtotime.php
s3v3n
Esta función es realmente más costosa que las otras soluciones. Proviene del uso excesivo de la función date ().
Jarzon
Buena fecha prorrateada. Gracias
Roque Mejos
172
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
     ->diff(new DateTime('now', $tz))
     ->y;

A partir de PHP 5.3.0, puede usar el útil DateTime::createFromFormatpara asegurarse de que su fecha no se confunda con el m/d/Yformato y la DateIntervalclase (vía DateTime::diff) para obtener el número de años entre ahora y la fecha objetivo.

salathe
fuente
1
Parece prometedor, pero desafortunadamente la mayoría de los servidores de alojamiento en mi país todavía usan PHP 5.2.x :(
GusDeCooL
3
¿Realmente necesita una zona horaria?
André Chalella 01 de
127
 $date = new DateTime($bithdayDate);
 $now = new DateTime();
 $interval = $now->diff($date);
 return $interval->y;
Wernight
fuente
Intenté usar DateTime () antes, pero esto congela el script. En mis registros veo Advertencia de PHP: fecha (): no es seguro confiar en la configuración de zona horaria del sistema, incluso cuando agrego date_default_timezone_set ('Europa / Bruselas');
stef
1
¿Estás seguro de haber eliminado el # antes de esa línea? Debería configurar eso en PHP.ini
Wernight
Por lo general, es seguro ignorar esa advertencia (especialmente en ese caso).
Wernight
96

Yo uso Fecha / Hora para esto:

$age = date_diff(date_create($bdate), date_create('now'))->y;
Andrey Korchak
fuente
Puede usar algo como esto para los formatos de fecha de estilo británico: $ age = date_diff (date_create (str_replace ('/', '.', $ Bdate)), date_create ('now')) -> y; por stackoverflow.com/questions/4163641/…
Richard
1
La solución más simple, una sola línea. Funciona solo en PHP 5.3+
Rhaymand Tatlonghari
60

Método simple para calcular Age desde dob:

$_age = floor((time() - strtotime('1986-09-16')) / 31556926);

31556926 es la cantidad de segundos en un año.

Miguel
fuente
16
uso excesivo de funciones ...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo
44
La mejor solución ... 1 liner, simple y evite usar: mktime
Timmy
1
@RobertM. ¿Es eso tan malo en este caso? No creo que estas funciones sean tan complejas o "pesadas"
Dewan159
1
@ Dewan159 mira el historial de edición ... se cambió para que coincida con mi solución;)
Mavelo
44
¿Qué pasa con los segundos bisiestos?
ksimka
17

// Calculadora de edad

function getAge($dob,$condate){ 
    $birthdate = new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $dob))))));
    $today= new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $condate))))));           
    $age = $birthdate->diff($today)->y;

    return $age;
}

$dob='06/06/1996'; //date of Birth
$condate='07/02/16'; //Certain fix Date of Age 
echo getAge($dob,$condate);
matinict
fuente
55
La mejor solución moderna 2016.
AlexioVay
14

Creo que esto funciona y es simple.

Resta de 1970 porque strtotime calcula el tiempo desde 1970-01-01 ( http://php.net/manual/en/function.strtotime.php )

function getAge($date) {
    return intval(date('Y', time() - strtotime($date))) - 1970;
}

Resultados:

Current Time: 2015-10-22 10:04:23

getAge('2005-10-22') // => 10
getAge('1997-10-22 10:06:52') // one 1s before  => 17
getAge('1997-10-22 10:06:50') // one 1s after => 18
getAge('1985-02-04') // => 30
getAge('1920-02-29') // => 95
Travis Mark Chong
fuente
Casi cierto ... strtotime () calcula el tiempo desde 1969-12-31 18:00:00
phoenix
8

Si desea calcular la edad de uso del dob, también puede usar esta función. Utiliza el objeto DateTime.

function calcutateAge($dob){

        $dob = date("Y-m-d",strtotime($dob));

        $dobObject = new DateTime($dob);
        $nowObject = new DateTime();

        $diff = $dobObject->diff($nowObject);

        return $diff->y;

}
hmoyat
fuente
8

Pensé en lanzar esto aquí ya que esta parece ser la forma más popular de esta pregunta.

Realicé una comparación de 100 años en 3 de los tipos más populares de funciones de edad que pude encontrar para PHP y publiqué mis resultados (así como las funciones) en mi blog .

Como puede ver allí , las 3 funciones funcionan bien con solo una ligera diferencia en la segunda función. Mi sugerencia basada en mis resultados es usar la tercera función a menos que desee hacer algo específico en el cumpleaños de una persona, en cuyo caso la primera función proporciona una manera simple de hacer exactamente eso.

¡Se encontró un pequeño problema con la prueba y otro problema con el segundo método! ¡La actualización llegará pronto al blog! Por ahora, tomaría nota, ¡el segundo método sigue siendo el más popular que encuentro en línea y, sin embargo, sigue siendo el que encuentro con más imprecisiones!

Mis sugerencias después de mi revisión de 100 años:

Si desea algo más alargado para que pueda incluir ocasiones como cumpleaños y tal:

function getAge($date) { // Y-m-d format
    $now = explode("-", date('Y-m-d'));
    $dob = explode("-", $date);
    $dif = $now[0] - $dob[0];
    if ($dob[1] > $now[1]) { // birthday month has not hit this year
        $dif -= 1;
    }
    elseif ($dob[1] == $now[1]) { // birthday month is this month, check day
        if ($dob[2] > $now[2]) {
            $dif -= 1;
        }
        elseif ($dob[2] == $now[2]) { // Happy Birthday!
            $dif = $dif." Happy Birthday!";
        };
    };
    return $dif;
}

getAge('1980-02-29');

Pero si simplemente quieres saber la edad y nada más, entonces:

function getAge($date) { // Y-m-d format
    return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}

getAge('1980-02-29');

Ver BLOG


Una nota clave sobre el strtotimemétodo:

Note:

Dates in the m/d/y or d-m-y formats are disambiguated by looking at the 
separator between the various components: if the separator is a slash (/), 
then the American m/d/y is assumed; whereas if the separator is a dash (-) 
or a dot (.), then the European d-m-y format is assumed. If, however, the 
year is given in a two digit format and the separator is a dash (-, the date 
string is parsed as y-m-d.

To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or 
DateTime::createFromFormat() when possible.
SpYk3HH
fuente
8

Puede usar la Carbonbiblioteca , que es una extensión de API para DateTime.

Usted puede:

function calculate_age($date) {
    $date = new \Carbon\Carbon($date);
    return (int) $date->diffInYears();
}

o:

$age = (new \Carbon\Carbon($date))->age;
Broshi
fuente
1
Esta es una solución más limpia pero requiere una biblioteca externa que puede no ser la mejor para cada proyecto
stef
1
El carbono ofrece la propiedad mágica age, que está haciendo a diffInYears. Por lo tanto se puede escribir:(new \Carbon\Carbon($date))->age
k0pernikus
4

Si no necesita una gran precisión, solo la cantidad de años, puede considerar usar el código a continuación ...

 print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));

Solo necesita poner esto en una función y reemplazar la fecha "1971-11-20" con una variable.

Tenga en cuenta que la precisión del código anterior no es alta debido a los años bisiestos, es decir, aproximadamente cada 4 años los días son 366 en lugar de 365. La expresión 60 * 60 * 24 * 365 calcula el número de segundos en un año: puede reemplácelo con 31536000.

Otra cosa importante es que, debido al uso de la marca de tiempo UNIX , tiene el problema del año 1901 y del año 2038, lo que significa que la expresión anterior no funcionará correctamente para fechas anteriores al año 1901 y posteriores al año 2038.

Si puede vivir con las limitaciones mencionadas anteriormente, ese código debería funcionar para usted.

Neven Boyanov
fuente
¿Qué sucederá en 2038 "cada sistema" se bloqueará si utiliza el tiempo ()?
Miguel
3
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);
Sergey Eremin
fuente
1
No funciona Su función indicaría que alguien nacido el 1 de septiembre de 1990 tiene la misma edad que alguien nacido el 1 de octubre de 1990: calcularía (2010 - 1990) = 20 para ambos.
PaulJWilliams
¿Qué precisión de edad necesitas? ¿mes? ¿día?
Sergey Eremin
3
  function dob ($birthday){
    list($day,$month,$year) = explode("/",$birthday);
    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;
    if ($day_diff < 0 || $month_diff < 0)
      $year_diff--;
    return $year_diff;
  }
CristiC
fuente
Parece estar bien en algunas fechas, pero para otras no devuelve nada, presumiblemente si no se cumple con el IF.
stef
3

He encontrado este script confiable. Toma el formato de fecha como AAAA-mm-dd, pero podría modificarse para otros formatos con bastante facilidad.

/*
* Get age from dob
* @param        dob      string       The dob to validate in mysql format (yyyy-mm-dd)
* @return            integer      The age in years as of the current date
*/
function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

    if ($day_diff < 0 || $month_diff < 0)
        $year_diff--;

    return $year_diff;
}
Phil Lewis
fuente
2
Por favor, algunos detalles de cómo será útil. Simplemente pegar una función no es una forma correcta de responder.
Starx
3
$birthday_timestamp = strtotime('1988-12-10');  

// Calculates age correctly
// Just need birthday in timestamp
$age = date('md', $birthday_timestamp) > date('md') ? date('Y') - date('Y', $birthday_timestamp) - 1 : date('Y') - date('Y', $birthday_timestamp);
Dmitriy
fuente
3

i18n:

function getAge($birthdate, $pattern = 'eu')
{
    $patterns = array(
        'eu'    => 'd/m/Y',
        'mysql' => 'Y-m-d',
        'us'    => 'm/d/Y',
    );

    $now      = new DateTime();
    $in       = DateTime::createFromFormat($patterns[$pattern], $birthdate);
    $interval = $now->diff($in);
    return $interval->y;
}

// Usage
echo getAge('05/29/1984', 'us');
// return 28
younes0
fuente
3

Pruebe cualquiera de estos utilizando el objeto DateTime

$hours_in_day   = 24;
$minutes_in_hour= 60;
$seconds_in_mins= 60;

$birth_date     = new DateTime("1988-07-31T00:00:00");
$current_date   = new DateTime();

$diff           = $birth_date->diff($current_date);

echo $years     = $diff->y . " years " . $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $months    = ($diff->y * 12) + $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $weeks     = floor($diff->days/7) . " weeks " . $diff->d%7 . " day(s)"; echo "<br/>";
echo $days      = $diff->days . " days"; echo "<br/>";
echo $hours     = $diff->h + ($diff->days * $hours_in_day) . " hours"; echo "<br/>";
echo $mins      = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour) . " minutest"; echo "<br/>";
echo $seconds   = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour * $seconds_in_mins) . " seconds"; echo "<br/>";

Referencia http://www.calculator.net/age-calculator.html

Shailesh Sonare
fuente
3

Escriba un script PHP para calcular la edad actual de una persona.

Muestra de fecha de nacimiento: 11.4.1987

Solución de muestra:

Código PHP:

<?php
$bday = new DateTime('11.4.1987'); // Your date of birth
$today = new Datetime(date('m.d.y'));
$diff = $today->diff($bday);
printf(' Your age : %d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
printf("\n");
?>

Salida de muestra:

Su edad: 30 años, 3 meses, 0 días.

Hosam Elzagh
fuente
2

Esta es mi función para calcular el DOB con el retorno específico de edad por año, mes y día

function ageDOB($y=2014,$m=12,$d=31){ /* $y = year, $m = month, $d = day */
date_default_timezone_set("Asia/Jakarta"); /* can change with others time zone */

$ageY = date("Y")-intval($y);
$ageM = date("n")-intval($m);
$ageD = date("j")-intval($d);

if ($ageD < 0){
    $ageD = $ageD += date("t");
    $ageM--;
    }
if ($ageM < 0){
    $ageM+=12;
    $ageY--;
    }
if ($ageY < 0){ $ageD = $ageM = $ageY = -1; }
return array( 'y'=>$ageY, 'm'=>$ageM, 'd'=>$ageD );
}

así como usarlo

$ age = ageDOB (1984,5,8); / * con mi hora local es 2014-07-01 * /
echo sprintf ("edad =% d años% d meses% d días", $ edad ['y'], $ edad ['m'], $ edad ['d']); / * salida -> edad = 29 años 1 mes 24 días * /
MdPutra
fuente
2

Esta función devolverá la edad en años. El valor de entrada es una cadena de día de nacimiento con formato de fecha (AAAA-MM-DD), por ejemplo: 2000-01-01

Funciona con día - precisión

function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

    // if we are any month before the birthdate: year - 1 
    // OR if we are in the month of birth but on a day 
    // before the actual birth day: year - 1
    if ( ($month_diff < 0 ) || ($month_diff === 0 && $day_diff < 0))
        $year_diff--;   

    return $year_diff;
}

Saludos, nira

nira
fuente
1

Si parece que no puedes usar algunas de las funciones más nuevas, aquí hay algo que preparé. Probablemente más de lo que necesita, y estoy seguro de que hay mejores formas, pero es fácil de leer, por lo que debería hacer el trabajo:

function get_age($date, $units='years')
{
    $modifier = date('n') - date('n', strtotime($date)) ? 1 : (date('j') - date('j', strtotime($date)) ? 1 : 0);
    $seconds = (time()-strtotime($date));
    $years = (date('Y')-date('Y', strtotime($date))-$modifier);
    switch($units)
    {
        case 'seconds':
            return $seconds;
        case 'minutes':
            return round($seconds/60);
        case 'hours':
            return round($seconds/60/60);
        case 'days':
            return round($seconds/60/60/24);
        case 'months':
            return ($years*12+date('n'));
        case 'decades':
            return ($years/10);
        case 'centuries':
            return ($years/100);
        case 'years':
        default:
            return $years;
    }
}

Ejemplo de uso:

echo 'I am '.get_age('September 19th, 1984', 'days').' days old';

Espero que esto ayude.

maiorano84
fuente
1

Debido al año bisiesto, no es aconsejable restar una fecha de otra y establecerla en el número de años. Para calcular la edad como los humanos, necesitarás algo como esto:

$birthday_date = '1977-04-01';
$age = date('Y') - substr($birthday_date, 0, 4);
if (strtotime(date('Y-m-d')) - strtotime(date('Y') . substr($birthday_date, 4, 6)) < 0)
{
    $age--;
}
mileusna
fuente
1

Lo siguiente funciona muy bien para mí y parece ser mucho más simple que los ejemplos que ya se han dado.

$dob_date = "01";
$dob_month = "01";
$dob_year = "1970";
$year = gmdate("Y");
$month = gmdate("m");
$day = gmdate("d");
$age = $year-$dob_year; // $age calculates the user's age determined by only the year
if($month < $dob_month) { // this checks if the current month is before the user's month of birth
  $age = $age-1;
} else if($month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it
  $age = $age;
} else if($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday
  $age = $age-1;
} else {
  $age = $age;
}

He probado y uso activamente este código, puede parecer un poco engorroso, pero es muy fácil de usar y editar y es bastante preciso.

JustSomeGuy
fuente
1

Siguiendo la primera lógica, debe usar = en la comparación.

<?php 
    function age($birthdate) {
        $birthdate = strtotime($birthdate);
        $now = time();
        $age = 0;
        while ($now >= ($birthdate = strtotime("+1 YEAR", $birthdate))) {
            $age++;
        }
        return $age;
    }

    // Usage:

    echo age(implode("-",array_reverse(explode("/",'14/09/1986')))); // format yyyy-mm-dd is safe!
    echo age("-10 YEARS") // without = in the comparison, will returns 9.

?>
maikelsalazar
fuente
Voto negativo Si bien funciona, es ineficiente usar un bucle para hacer matemáticas básicas.
Wranorn
1

Es un problema cuando usa strtotime con DD / MM / AAAA. No puedes usar ese formato. En lugar de eso, puede usar MM / DD / AAAA (o muchos otros como AAAAMMDD o AAAA-MM-DD) y debería funcionar correctamente.

Bruno Foggia
fuente
1

¿Qué tal iniciar esta consulta y hacer que MySQL la calcule por usted?

SELECT 
username
,date_of_birth
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) DIV 12 AS years
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) MOD 12 AS months
FROM users

Resultado:

r2d2, 1986-12-23 00:00:00, 27 , 6 

El usuario tiene 27 años y 6 meses (cuenta un mes completo)

Artur Kędzior
fuente
Esta es en realidad una buena solución para las personas en versiones anteriores a 5.3 de PHP que no tienen acceso a date_diff y similares.
strangerstudios
1

Lo hice así.

$geboortedatum = 1980-01-30 00:00:00;
echo leeftijd($geboortedatum) 

function leeftijd($geboortedatum) {
    $leeftijd = date('Y')-date('Y', strtotime($geboortedatum));
    if (date('m')<date('m', strtotime($geboortedatum)))
        $leeftijd = $leeftijd-1;
    elseif (date('m')==date('m', strtotime($geboortedatum)))
       if (date('d')<date('d', strtotime($geboortedatum)))
           $leeftijd = $leeftijd-1;
    return $leeftijd;
}
Smorvy
fuente
1

La respuesta principal para esto está bien, pero solo calculó el año en que nació una persona, lo modifiqué para mis propios fines para trabajar el día y el mes. Pero pensé que valía la pena compartirlo.

Esto funciona tomando una marca de tiempo del DOB de los usuarios, pero siéntase libre de cambiar eso

$birthDate = date('d-m-Y',$usersDOBtimestamp);
$currentDate = date('d-m-Y', time());
//explode the date to get month, day and year
$birthDate = explode("-", $birthDate);
$currentDate = explode("-", $currentDate);
$birthDate[0] = ltrim($birthDate[0],'0');
$currentDate[0] = ltrim($currentDate[0],'0');
//that gets a rough age
$age = $currentDate[2] - $birthDate[2];
//check if month has passed
if($birthDate[1] > $currentDate[1]){
      //user birthday has not passed
      $age = $age - 1;
} else if($birthDate[1] == $currentDate[1]){ 
      //check if birthday is in current month
      if($birthDate[0] > $currentDate[0]){
            $age - 1;
      }


}
   echo $age;
Paul Ledger
fuente
1

Si solo desea obtener años completos a medida que envejece, hay una manera súper simple de hacerlo. tratar las fechas formateadas como 'AAAAMMDD' como números y restarlas. Después de eso, cancele la parte MMDD dividiendo el resultado con 10000 y bajando el piso. Simple y nunca falla, incluso toma en cuenta los años lectivos y la hora actual del servidor;)

Desde los primeros días de parto o en su mayoría proporcionados por fechas completas en el lugar de nacimiento y son relevantes para la HORA LOCAL ACTUAL (donde realmente se realiza la verificación de edad).

$now = date['Ymd'];
$birthday = '19780917'; #september 17th, 1978
$age = floor(($now-$birtday)/10000);

así que si quieres comprobar si alguien tiene 18 o 21 años o menos de 100 en tu zona horaria (no importa la zona horaria de origen) por cumpleaños, esta es mi forma de hacerlo

matemática simple
fuente
0

Prueba esto :

<?php
  $birth_date = strtotime("1988-03-22");
  $now = time();
  $age = $now-$birth_date;
  $a = $age/60/60/24/365.25;
  echo floor($a);
?>
Miguel
fuente