Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luciano Paker

Função para Calcular Idade

Recommended Posts

Peguei esta função para calcular a idade, calculando a diferença entre 2 datas.

 

Queria saber porque quando informo uma data maior que 2038 ele calcula a idade errada?

 

Por exemplo a idade de quem nasceu em 25/03/1986, estará com quantos anos do dia 25/03/2041 por exemplo.

 

Segue a função:

 

[inline]function CalculaIdade($data_nasc, $data = "hoje"){
// Separa em dia, mês e ano
list($dia_idade, $mes_idade, $ano_idade) = explode('/', $data_nasc);

if($data == "hoje"){
// Descobre que dia é hoje e retorna a unix timestamp
$hoje_idade = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
}else{
//Pega a data
list($dia_hj, $mes_hj, $ano_hj) = explode('/', $data);
// Descobre que dia é hoje e retorna a unix timestamp
$hoje_idade = mktime(0, 0, 0, $mes_hj, $dia_hj, $ano_hj);
}

// Descobre a unix timestamp da data de nascimento do fulano
$nascimento_idade = mktime( 0, 0, 0, $mes_idade, $dia_idade, $ano_idade);

// Depois apenas fazemos o cálculo já citado :)
$idade_idade = floor((((($hoje_idade - $nascimento_idade) / 60) / 60) / 24) / 365.25);

return $idade_idade;
}

echo CalculaIdade("25/03/1986","26/03/2038");[/inline]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso esta Função:

 

function calcula_idade($data_nascimento, $data)	{
    $data_nascimento = strtotime($data_nascimento." 00:00:00");
    $data_calcula = strtotime($data_calcula." 00:00:00");
    $idade = floor(abs($data_calcula-$data_nascimento)/60/60/24/365);
    echo $idade;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sweet DateTime

date_default_timezone_set('America/Sao_Paulo');

$nascimento = DateTime::createFromFormat('Y-m-d','1984-01-06');
$diff = $nascimento->diff(new DateTime());

print_r($diff);

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Sweet DateTime

date_default_timezone_set('America/Sao_Paulo');

$nascimento = DateTime::createFromFormat('Y-m-d','1984-01-06');
$diff = $nascimento->diff(new DateTime());

print_r($diff);

 

hufersil, como faço para especificar uma data que não seja a atual de hoje?

 

Por exemplo:

$nascimento = DateTime::createFromFormat('2043-01-06','1984-01-06');

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Eu uso esta Função:

 

function calcula_idade($data_nascimento, $data)	{
    $data_nascimento = strtotime($data_nascimento." 00:00:00");
    $data_calcula = strtotime($data_calcula." 00:00:00");
    $idade = floor(abs($data_calcula-$data_nascimento)/60/60/24/365);
    echo $idade;
}

 

Não deveria ser assim Cesar

calcula_idade($data_nascimento, $data_calcula)

ao invés de

calcula_idade($data_nascimento, $data)

???

 

@Topico - Achei mais simples o código do Cesar mais simples e facil de manipular. Usar o date_default_timezone_set não parece ser uma boa no seu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@masi

O uso do date_default_timezone_set é para que não dê warning e o PHP saiba qual Timezone usar.

 

Ele deve ser sempre definido ou via código PHP, no php.ini ou via .htaccess. Resumo: ele não precisa ser chamado o tempo todo.

 

DateTime::diff retorna várias outras informações úteis, não somente a idade (anos). E muito mais simples do que o calculo que ele indicou, além de ser orientado a objeto.

 

@Luciano

Veja a documentação

Compartilhar este post


Link para o post
Compartilhar em outros sites

@hufersil Realmente, falei merda ali. Agora vendo a documentação do DateTime, parece ser interessante. Apenas lembrando, nem sempre tudo que é Orientada por Classe é mais simples, principalmente para quem está começando com php. Mesmo assim, não parece ser difícil usar o DateTime

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deveria ser assim Cesar

calcula_idade($data_nascimento, $data_calcula)

ao invés de

calcula_idade($data_nascimento, $data)

???

 

@Topico - Achei mais simples o código do Cesar mais simples e facil de manipular. Usar o date_default_timezone_set não parece ser uma boa no seu caso.

 

Nem Percebi é mesmo data_calcula eu tinha alterado mas esqueci de alterar no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda prefiro a classe DateTime

<?php

$date = new DateTime( '1901-10-11' ); // data de nascimento
$interval = $date->diff( new DateTime( '2011-12-14' ) ); // data definida

echo $interval->format( '%Y Anos, %m Meses e %d Dias' ); // 110 Anos, 2 Meses e 2 Dias

?>





Com as horas, minutos e segundos

<?php

$date = new DateTime( '1901-10-11 16:08:00' ); // data e hora de nascimento
$interval = $date->diff( new DateTime( ) ); // data e hora atual

echo $interval->format( '%Y Anos, %m Meses, %d Dias, %H Horas, %i Minutos e %s Segundos' );

?>




:closedeyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.