Ir para conteúdo

POWERED BY:

Arquivado

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

Carlos Braga (c)

[Resolvido] Calcular Idade, transformar em xx Anos, xx meses, xx

Recommended Posts

Olá Pessoal,

 

Estou tentando criar um script que calcula a idade de uma pessoa, e estou com algumas dificuldades.

 

Primeiro eu gravo no MySQL a data de nascimento da forma: 00/00/0000 dd/mm/aa

Segudo, preciso resgatar esse valor passar por algum script e printar ele na tela do usuario.

Trazer o valor em variavel ate ai tudo bem, o problema é o calculo...

 

Em alguns casos eu preciso apresentar somente o XX Mes(es), outros somente XX Ano(s)

 

 

Achei esse script e tentei utiliza-lo mas estou com dificuldade, ele apresenta o erro la no final

 

Fatal error: Call to undefined function: ultimodiames() in /dominios/vhosts/dominio.com.br/html/calcula_idade.php on line 55

 

 

<?php

echo CalculaIdade('17/07/1984', "dma", "/"); // Separador / Dia/Mes/Ano

echo CalcularIdade('2006-08-17',"amd","-"); // Separados - Ano/Mes/Dia


function CalculaIdade($nascimento, $formato, $separador)
{
	//Data Nascimento
	$nascimento = explode($separador, $nascimento);

	if ($data1>$data2)
	{
       return " ";
    }

	if ($formato=="dma")
	{
		$ano = $nascimento[2];
		$mes = $nascimento[1];
		$dia = $nascimento[0];
	}
	elseif ($formato=="amd")
	{
		$ano = $nascimento[0];
		$mes = $nascimento[1];
		$dia = $nascimento[2];
	}

	$dia1 = $dia;
	$mes1 = $mes;
	$ano1 = $ano;

    $dia2 = date("d");
    $mes2 = date("m");
    $ano2 = date("Y");

    $dif_ano = $ano2 - $ano1;
    $dif_mes = $mes2 - $mes1;
    $dif_dia = $dia2 - $dia1;

    if ( ($dif_mes == 0) and ($dia2 < $dia1) ) {
       $dif_dia = (ultimoDiaMes($data1) - $dia1) + $dia2;
       $dif_mes = 11;
       $dif_ano--;
    } elseif ($dif_mes < 0) {
       $dif_mes = (12 - $mes1) + $mes2;
       $dif_ano--;
       if ($dif_dia<0){
          $dif_dia = (ultimoDiaMes($data1) - $dia1) + $dia2;
          $dif_mes--;
       }
    } elseif ($dif_dia < 0) {
       $dif_dia = (ultimoDiaMes($data1) - $dia1) + $dia2;
       if ($dif_mes>0) {
          $dif_mes--;
       }
    }
    if ($dif_ano>0) {
       $dif_ano = $dif_ano . " ano" . (($dif_ano>1) ? "s ": " ") ;
    } 
	else { $dif_ano = ""; }
    if ($dif_mes>0) {
       $dif_mes = $dif_mes . " mes" . (($dif_mes>1) ? "es ": " ") ;
    } 
	else { $dif_mes = ""; }
    if ($dif_dia>0) {
       $dif_dia = $dif_dia . " dia" . (($dif_dia>1) ? "s ": " ") ;
    } 
	else { $dif_dia = ""; }

    return $dif_ano . $dif_mes . $dif_dia;
//return $dif_ano . $dif_mes;

  }
?>

Fonte do Script: http://codigofonte.uol.com.br/codigo/php/validacao/calcular-idade-com-php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seja mais específico amigo....

 

Esta função que você apresentou ai, parece ser de conversão de formato de data. (Americano para Portugues( e virse versa)).

Pois o calculo é simples, se for oque estou pensando você teria que seguir esta lógica:

 

1) Gravar separadamente no BD o dia, mes e ano do cliente;

2) criar o script para resgatar este valor do BD e grava-lo em uma variavel.

3) Criar o calculo (subtração), do ano vigente com o ano do cliente.

4) Dar um echo da variável que contiver o dia, mes e do calculo.

 

Espero ter lhe ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá INTUITO BINÁRIO

 

Na verdade estou gravando a data de nascimento da seguinte forma: dia/mes/ano ficando = 31/12/1980

 

Ele nao esta no formato atual do Mysql, isso seria errado ?

Na verdade estou fazendo asism pois utilizei uma mascara no formulario, e isso facilitou clientes que deixam dados sem / ou -

 

O que eu preciso é resgatar o calculo da idade em meses ou anos, se caso o bebe tenha apenas 9 meses, ele apresenta isso, se ele tiver já 1 ano ele apresenta ano... acredito que isso deve ser feito no php mas já vi rumores que da pra fazer em MYSQL.

 

Alguem ai tem ideia?

 

Obrigado

 

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

um... sugestão:

 

mude para o tipo DATE no sql.. fica muito mais fácil de trabalhar..

http://www.pedrocorreia.net/mySnippets/sql/Calcular-A-Idade-Em-MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa será que consigo montar isso sem ter que mudar o padrão dos cadastros que já criei ?

 

Estou gravando no banco assim: 00/00/0000 = dia/mes/ano

 

Nao quero ter que mudar tudo, se não vou passar um bom tempo alterado layout e todos os forms que ja estao funcionando

 

:( :(

 

Alguem pode me dar uma luz

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, é mudar a tabela do banco de dados ! só isso.

 

não precisa mexer em form

não precisa mexer em layout

 

na hora de receber a data, que vai vir: dd/mm/aaaa

 

você converte para colocar no bd para: aaaa-mm-dd

 

e na hora de mostrar, você converte de volta para dd/mm/aaaa

 

essa dúvida de 'ter que alterar tudo', só acontece qndo você começa errado.

no teu caso, ainda dá tempo de fazer o correto, e evitar futuras dores de cabeça... em vez de ficar remendando..

Compartilhar este post


Link para o post
Compartilhar em outros sites

William,

 

Eu fiz uma rotina em php pegar os dados no formato mysql, porem conforme aquele link que você passou, eu até fiz igual, tentei mudar algumas coisas, mas ele só retorna o ano

 

Eu preciso de um valor também em meses, digamos que você queira saber qual a idade de uma criança que aninda nao completou 1 ano... é igual a xxx Meses...

 

Como vou trabalhar com idades menores que 1 ano, preciso criar algum script que me retorne valores para os meses

 

Tem ideia se eu posso fazer isso ja do MYSQL ?

Ou faço isso em PHP mesmo ?

 

Aquele script que eu postei até faz isso, mas ele da um erro quando coloco datas abaixo de 2000.

 

Valew

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz um teste aqui:

<?php
	$mysqli = new mysqli('localhost', 'root', '123', 'test');
	
	$sql = "
		SELECT nome, 
			YEAR( CURRENT_DATE( ) ) - YEAR( `nascimento` ) AS anos, 
			MONTH( CURRENT_DATE( ) ) - MONTH( nascimento ) AS meses, 
			DAY( CURRENT_DATE( ) ) - DAY( nascimento ) AS dias,
			DATE_FORMAT( nascimento, '%d/%m/%Y') AS data_nascimento 
		FROM `pessoa`";
		
	$query = $mysqli->query( $sql );
	while( $dados = $query->fetch_object() )
	{
		echo '<li>',$dados->nome, ' - <strong>', idade( $dados->anos, $dados->meses, $dados->dias ), '</strong> e nasceu em: ', $dados->data_nascimento,'</li>';
	}
	
function idade( $anos, $meses, $dias )
{
	if( $meses<0 )
	{
		$idade_anos = $anos-1;
		$idade_meses = 12+$meses;
	}
	else
		$idade_meses = $meses;
		
		
	$meses = $idade_meses==1 ? $idade_meses.' mês' : $idade_meses.' meses';
	return round( $idade_anos ).' anos e '.$meses.' de vida';
}

tabela:

--
-- Estrutura da tabela `pessoa`
--

CREATE TABLE IF NOT EXISTS `pessoa` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  `nascimento` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Extraindo dados da tabela `pessoa`
--

INSERT INTO `pessoa` (`id`, `nome`, `nascimento`) VALUES
(1, 'Bruno', '2010-01-03'),
(2, 'William', '1988-12-14'),
(3, 'Ju', '2010-08-18');

saída:

# Bruno - 0 anos e 8 meses de vida
# William - 21 anos e 9 meses de vida
# Ju - 0 anos e 1 mês de vida

não tá com precisão de 'dias', pois no caso, a 'Ju', não tem 1 mês de vida ainda, pq completa 1 mês amanhã.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de bola William!!!

 

Eu achei este post do João Batista Neto aqui do forum, antes de ver seu post eu estava tentando inserir if/else ali para imprimir meses ou anos, veja que nele, tem até a contagem de precisao de bisextos.

 

<?php

/**
 * Calcula a idade levando em consideração anos bisextos
 * @param integer $d Dia
 * @param integer $m Mês
 * @param integer $y Ano
 * @return array
 */
function calculaIdadeS( $d , $m , $y ){
        $arr    = explode( '-' , date( 'm-d-Y' ) );
        $days   = call_user_func_array( 'gregoriantojd' , $arr ) - gregoriantojd( $m , $d , $y );
        $aux    = $days / 365.2425;
        $years  = floor( $aux );
        $days   = floor( 365.2425 * ( $aux - $years ) );
        $months = 0;

        /**
         * Como os meses de fevereiro com 29 dias já foram levados em consideração no cálculo
         * anterior, no cálculo de meses consideramos fevereiro como tendo apenas 28 dias.
         */
        while ( $days >= 28 ){
                $sub = 28;

                if ( ( $m % 2 ) == 1 ) $sub = 31;
                if ( $m != 2 ) $sub = 30;

                if ( $sub <= $days ){
                        $days -= $sub;

                        $m = $m == 12 ? 1 : $m + 1;
                        ++$months;
                } else break;
        }

        return array( 'y' => $years , 'm' => $months , 'd' => $days );
}

date_default_timezone_set( 'America/Sao_Paulo' );
$idade = calculaIdadeS( 5 , 7 , 2010 );



if( $idade[ 'y' ] == '12'){
	// Se tiver 12 meses printa isso

echo 'Ele tem: ' , $idade[ 'm' ] , ' meses, ';

} elseif {
	
	//Se tiver meses printa isso

echo 'Ele tem: ' , $idade[ 'y' ] , ' anos, ';


}

//echo 'A idade é: ' , $idade[ 'y' ] , ' anos, ' , $idade[ 'm' ] , ' meses e ' , $idade[ 'd' ] , ' dias.';

?>

Fonte: http://forum.imasters.com.br/index.php?/topic/381024-calculo-de-idade/

 

William,

 

Eu fiz as modificações neste, acho que agora da pra usar como eu precisava

 

Veja como ficou

 

<?php

/**
 * Calcula a idade levando em consideração anos bisextos
 * @param integer $d Dia
 * @param integer $m Mês
 * @param integer $y Ano
 * @return array
 */
function calculaIdadeS( $d , $m , $y ){
        $arr    = explode( '-' , date( 'm-d-Y' ) );
        $days   = call_user_func_array( 'gregoriantojd' , $arr ) - gregoriantojd( $m , $d , $y );
        $aux    = $days / 365.2425;
        $years  = floor( $aux );
        $days   = floor( 365.2425 * ( $aux - $years ) );
        $months = 0;

        /**
         * Como os meses de fevereiro com 29 dias já foram levados em consideração no cálculo
         * anterior, no cálculo de meses consideramos fevereiro como tendo apenas 28 dias.
         */
        while ( $days >= 28 ){
                $sub = 28;

                if ( ( $m % 2 ) == 1 ) $sub = 31;
                if ( $m != 2 ) $sub = 30;

                if ( $sub <= $days ){
                        $days -= $sub;

                        $m = $m == 12 ? 1 : $m + 1;
                        ++$months;
                } else break;
        }

        return array( 'y' => $years , 'm' => $months , 'd' => $days );
}

date_default_timezone_set( 'America/Sao_Paulo' );
$idade = calculaIdadeS( 5 , 2 , 2010 );


//echo 'A idade é: ' , $idade[ 'y' ] , ' anos, ' , $idade[ 'm' ] , ' meses e ' , $idade[ 'd' ] , ' dias.';


if( $idade[ 'y' ] <= '0'){
	// Se tiver 12 meses printa isso

echo '<br>Ele tem: ' , $idade[ 'm' ] , ' mese(s), <br>';

} else {
	
	//Se tiver meses printa isso

echo '<br>Ele tem: ' , $idade[ 'y' ] , ' ano(s), <br>';


}

?>

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.