Show age in years in php

Asked

Viewed 1,938 times

10

I would like to pick up through the date information, the age of the person in years:

For example:

06/09/1991 --> 24 years 05/12/1998 --> 16 years

Suppose I have these dates in php

$data1 = new DateTime('19910906');
$data2 = new DAteTime('19981205');

How could I show both in years?

4 answers

13


To compare these dates with the current date use new DateTime() (to get the current date) with the function diff:

$data1 = new DateTime('19910906');
$data2 = new DateTime('19981205');

$idadeData1 = $data1->diff(new DateTime());
$idadeData2 = $data2->diff(new DateTime());

echo "Idade1: " . $idadeData1->y . " anos.";
// OUTPUT: Idade1: 24 anos.
echo "Idade2: " . $idadeData2->y . " anos.";
// OUTPUT: Idade2: 16 anos.

See on Ideone.

If it were the case to compare the dates between them, you could do so:

$data1 = new DateTime('19910906');
$data2 = new DAteTime('19981205');

$idade = $data1->diff($data2);

The function diff will always return an object DateInterval:

object(DateInterval)[3]
  public 'y' => int 7
  public 'm' => int 2
  public 'd' => int 29
  public 'h' => int 0
  public 'i' => int 0
  public 's' => int 0
  public 'weekday' => int 0
  public 'weekday_behavior' => int 0
  public 'first_last_day_of' => int 0
  public 'invert' => int 0
  public 'days' => int 2647
  public 'special_type' => int 0
  public 'special_amount' => int 0
  public 'have_weekday_relative' => int 0
  public 'have_special_relative' => int 0

So to know the age just access the index y, with the operator ->:

echo "A idade é de " . $idade->y . "anos."; 
// output: A idade é de 7 anos.

See on Ideone.

  • 1

    That’s what I was trying to do.

4

PHP >= 5.3

Example using date_create(), date_diff():

# Orientado a objetos
$from = new DateTime('19910906');
$to   = new DateTime('today');
echo 'Idade1 ' . $from->diff($to)->y . " anos.";

# Procedural
echo 'Idade2 ' . date_diff(date_create('19981205'), date_create('today'))->y . " anos.";

See working on Ideone.

Previous versions:

function minhaIdade($date) {
    return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}

echo 'Idade1 ' . minhaIdade('19910906') . ' anos';
echo 'Idade1 ' . minhaIdade('19981205') . ' anos';
  • Excellent!! and me killing myself with timestamp.

1

One way to check the age is to subtract the current date by the other date, assuming the date is in a correct format (mainly in YYYY-MM-DD, but other formats can also be used, such as YYYYMMDD, DD-MM-YYYY, MM/DD/YYYY...):

echo floor((time() - strtotime('2000-10-01')) / (60 * 60 * 24 * 365));
// Resultado: 17

The time will inform the date in Unixtime format (ie second since 1970). The strtotime will convert the string to Unixtime. O floor will round down.


As stated in the documentation: "Using this function for mathematical operations is not recommended." consider only as another option, the answer from @gustavox is even more appropriate.

-3

Follows code commented:

//adicionar as tags *PHP* **<?php** ao início e **?>** ao final do código
// substitua $pacientes['data']) pela data do nascimento ou pela primeira data, isto é, a mais antiga.

$data1 = date("Y-m-d", strtotime($pacientes['data'])); // data nascimento
$data2 = date("Y-m-d"); // data atual
$data2b = date('Y-m-d', strtotime('+1 year')); // data daqui um ano
$data3 = $data2b - date('z', strtotime($data2)); // primeiro dia próximo ano
$data3b = date('Y-m-d', strtotime('+1 month')); // data daqui um mês
$data4 = $data3b - date('z', strtotime($data2)); // primeiro dia próximo mês

$d1_ano = date('Y', strtotime($data1));
$d2_ano = date('Y', strtotime($data2));
$r_ano = $d2_ano - $d1_ano;
$d1_dia = ($d1_ano*365.25)+date('z', strtotime($data1));
$d2_dia = ($d2_ano*365.25)+date('z', strtotime($data2)); // z = nª dia/ano

$r_dia = $d2_dia - $d1_dia; //dias vividos desde nascimento

$r_ano = $r_dia / 365.25; //anos vividos desde nascimento

$r_mes = $r_ano*30; // meses vividos desde nascimento

$f1_ano = date('Y', strtotime($data1));
$f2_ano = date('Y', strtotime($data3));
$rf_ano = $f2_ano - $f1_ano;
$f1_dia = ($f1_ano*365.25)+date('z', strtotime($data1));
$f2_dia = ($f2_ano*365.25)+date('z', strtotime($data1));

$rf_dia = $f2_dia - $f1_dia; // dias p/ próximo aniversário

$rf_ano = $rf_dia / 365.25; // idade (ano) atual 

$f_dia = ($r_dia - $rf_dia); // idade (dia) atual ou dias vividos este ano

$f_mes = $f_dia/30; // idade (mês) atual ou meses vividos este ano


if($rf_ano <= 1) {
    $concordancia_ano = "ano";
} else {
    $concordancia_ano = "anos";
};

if($f_mes <= 1) {
    $concordancia_mes = "mês";
} else {
    $concordancia_mes = "meses";
};


echo floor($rf_ano); echo " "; echo $concordancia_ano; echo " e "; echo floor($f_mes); echo " "; echo $concordancia_mes; echo ".";

B'H all the knowledge.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.