Ir para conteúdo
klonder

Calcular de idade em Python incluindo anos bissextos

Recommended Posts

Boas galera!

Vou deixar aqui um código que acabei de criar de um método que recebe a data de nascimento em formato de string e retorna a idade. Eu tinha esse código em JAVA, fiz umas melhorias e adaptei para Python, para o novo sistema que estou desenvolvendo.

Deixo aí para quem precisar e também para minhas pesquisas futuras:

O método retorna a idade no padrão: AAa | AAa MMm | AAa MMm DDd, exemplos: 38a | 38a 14m | 38a 14m 5d

Deixei o parâmetro "tipo" podendo receber "a", "m", "d" apenas para facilitar a referência a "anos", "meses" e "dias", mas sintam-se à vontade para alterar depois!

Boa sorte!

from datetime import datetime,date


def calcularIdade(self,dtYYYYMMDD,tipo):
        #dtYYYYMMDD: string de data no formato YYYY-MM-DD (exemplo: padrão SQL)
        #tipo: Pode receber "a","m","d" -> a: retorna YYa | m: retorna YYa MMd | d: retorna YYa MMm DDd

        dtDN = datetime.strptime(dtYYYYMMDD, '%Y-%m-%d').date()
        dtHoje = date.today()

        anoNasc = int(dtDN.strftime('%Y'))
        anoHoje = int(dtHoje.strftime('%Y'))
        mesNasc = int(dtDN.strftime('%m'))
        mesHoje = int(dtHoje.strftime('%m'))
        diaNasc = int(dtDN.strftime('%d'))
        diaHoje = int(dtHoje.strftime('%d'))
        dtNiver = datetime.strptime(str(anoHoje)+"-"+str(mesNasc)+"-"+str(diaNasc), '%Y-%m-%d').date()

        diffAnos = anoHoje-anoNasc
        diffMeses = mesHoje-mesNasc        
        diffDias = diaHoje-diaNasc

        if dtHoje<dtNiver:#Ainda não fez aniversário esse ano!
            diffAnos = anoHoje-anoNasc-1#Corrigindo o ano, pois ainda não fez aniversário
            diffMeses = 12+diffMeses#Corrigindo os meses/diffMeses é negativo!!!

        if diaHoje < diaNasc:#O mês ainda não virou
            diffMeses = diffMeses-1                        
            #Para o cálculo dos dias, é importante avaliar uma série de variáveis: Mês com 28,20,30 ou 31 dias
            mes_anterior_31d = [1,2,4,6,9,11]
            mes_anterior_30d = [5,7,8,10,12]
            if mesHoje in mes_anterior_31d:
                diffDias = (31-diaNasc)+diaHoje
            elif mesHoje in mes_anterior_30d:
                diffDias = (30-diaNasc)+diaHoje
            else:
                if anoHoje%4 == 0:#Cálculos para anos bissextos
                    diffDias = (29-diaNasc)+diaHoje
                else:#Anos não bissextos
                    diffDias = (28-diaNasc)+diaHoje

        if tipo == "a":
            return str(diffAnos)+"a"
        elif tipo == "m":
            return str(diffAnos)+"a "+str(diffMeses)+"m "
        else:
            return str(diffAnos)+"a "+str(diffMeses)+"m "+str(diffDias)+"d"

Exemplo de chamada:

print(self.calcularIdade("1981-09-11","d"))

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Pedro HSA
      OLÁ
       
      TENHO DOIS OBJETOS EM UMA PÁGINA, UM TEXTBOX DE TYPE="DATA" E UM LABEL.
       
      GOSTARIA QUE ASSIM QUE O USUÁRIO DIGITASSE UMA DATA, SUA IDADE FOSSE EXIBIDA NO LABEL.
       
      <!DOCTYPE html> <html lang="pt-br"> <head> <title>CALCULAR iDADE</title> </head> <body> <!-- Div Data de Nascimento --> <div class="input-group col-xs-12 col-sm-12 col-md-10"> <span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span> <input class="form-control" id="dtnasc" data-format="dd-mm-yyyy" maxlength="10" type="date" name="date" placeholder="Data de Nascimento"/> </div> <!-- Div label IDADE --> <div id="idade" class="input-group col-xs-12 col-sm-12 col-md-1" style="background-color: #ccc; border-style: groove;> <p class="form-control-static">ID</p> </div> </body> </html>  
×

Informação importante

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