Jump to content
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"))

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.