Ajude nosso projeto a se manter online, faça um PIX de qualquer valor:
programacao.progressiva@gmail.com

Determinar se uma data é válida ou não em Python

"Faça um Programa que peça uma data no formato dd/mm/aaaa e determine se a mesma é uma data válida."

Saber se uma data é válida ou inválida em Python

Vamos armazenar os dados nas variáveis 'dia', 'mes' e 'ano'.

Para armazenar o valor lógico verdadeiro ou falso, vamos usar a variável booleana 'valido'. Inicialmente fazer ela ser falsa:
valido = False

O grande segredo nesse algoritmo é o mês.

Primeiro vamos testar se o mês digitado tem 31 dias.
São os meses 1, 3, 5, 7, 8, 10 ou mês 12.
Se tiver digitado um desses valores para 'mes', vamos verificar a variável 'dia' é menor ou igual a 31. Se for, a data é válida e fazemos 'valida = True'
Se não for, continua sendo False

Agora vamos testar os meses que tem 30 dias.
Eles são os meses 4, 6, 9 e o mês 11.
Nesses meses, temos que avaliar se a variável 'dia' tem um número menor ou igual a 30. Se sim, fazemos 'valida = True'.

Por fim, vamos avaliar o mês mais problemático, o mês 2, fevereiro.
Inicialmente, é preciso verificar se é ano bissexto, se for bissexto a variável 'dia' deve ser testada para saber se o valor digitado é 29 ou menos. Se sim, validamos a data com 'valida = True'

Se não for ano bissexto, testamos a variável 'dia' para saber se o valor digitado foi 28 ou menos. Se for, 'valida = True'

Caso não tenham digitado um número de 1 até 12 em mês, a variável 'valida' continua tendo valor False, pois não caiu em nenhum IF ou ELIF.

Por fim, testamos a variável booleana 'valida'. Se for True, dizemos que a data é válida, se tiver o valor lógico False nela, dizemos que é inválida:
    dia = int( input('Dia: ') )
    mes = int( input('Mês: ') )
    ano = int( input('Ano: ') )

    valida = False
    
    # Meses com 31 dias
    if( mes==1 or mes==3 or mes==5 or mes==7 or \
        mes==8 or mes==10 or mes==12):
        if(dia<=31):
            valida = True
    # Meses com 30 dias
    elif( mes==4 or mes==6 or mes==9 or mes==11):
        if(dia<=30):
            valida = True
    elif mes==2:
        # Testa se é bissexto
        if (ano%4==0 and ano%100!=0) or (ano%400==0):
            if(dia<=29):
                valida = True
        elif(dia<=28):
                valida = True

    if(valida):
        print('Data válida')
    else:
        print('Inválida')


10 comentários:

  1. Olá amigo, na situação que verifica o ano bissexto, não seria if (ano%4==0 and ano%100!=0) ? Você colocou 400 lá

    ResponderExcluir
    Respostas
    1. Acho que não, eu fui pesquisar para tirar a duvida desta parte e encontrei isso:
      "No entanto, vale atentar para algumas observações importantes sobre o funcionamento dos anos bissextos: os anos seculares, por exemplo, não são considerados bissextos, com exceção daqueles cujos dois primeiros algarismos são divisíveis por quatro. Exemplo: 1600, 2000, 2400 e etc."

      Excluir
    2. Para funcionar precisa tirar o testafor ano%400!=0
      porque essa REGRA mostra a excessão dos multiplos de 4.
      Nos anos multiplos de 400, não é ano bissexto

      Excluir
  2. Acabei pensando de forma diferente, sera q tem algum hack nesse codigo?

    dias=int(input("Digite o dia do mes:"))
    mes=int(input("Digite o mes:"))
    ano=int(input("Digite o ano:"))
    aux1=dias
    aux2=mes
    aux3=ano
    if dias>0 and dias<=31:
    dias=True
    else:
    dias=False
    if mes>0 and mes<=12:
    mes=True
    else:
    mes=False
    if ano>=0 and ano<=9999:
    ano=True
    else:
    ano=False

    if dias==True and mes==True and ano==True:
    print("Data valida!: %d/%d/%d" %(aux1, aux2, aux3))
    else:
    print("Data invalida!")

    ResponderExcluir
    Respostas
    1. Nem todos os meses tem entre 1 e 31 dias, Eduardo. Alguns não tem o dia 31, já fevereiro é mais limitado também etc, tem esses cases particulares.

      Excluir
  3. Olá.
    Veja o código:
    dia = int(input("Digite um dia: "))
    mes = int(input("Digite um mês: "))
    ano = int(input("Digite um ano: "))

    data = (dia, mes, ano)

    Sei que a sintaxe que eu escrevi está errada, mas eu gostaria de saber como eu faço para armazenar (dia, mes, ano) e apenas uma variável e depois formatá-la de forma correta.
    Alguém poderia me auxiliar?
    Obrigado
    Porto

    ResponderExcluir
  4. """Faça um Programa que peça uma data no formato dd/mm/aaaa e determine se a mesma é uma data válida.
    ano bisexto e tudo mais datas certas dias etc
    """

    dias = int(input('Informe uma data (dd/mm/aaaa) - Dias: '))
    mes = int(input('Informe uma data (dd/mm/aaaa) - Mes: '))
    ano = int(input('Informe uma data (dd/mm/aaaa) - Ano: '))
    meses_31 = [1, 3, 5, 7, 8, 10, 12]
    meses_30 = [4, 6, 9, 11]

    def ano_bissexto():
    if (ano%4 == 0) and (ano%400 == 0) and (not ano%100):
    return True
    else:
    return False
    ano_bisx = ano_bissexto()

    def dias_bissexto():
    if (ano_bisx == True) and (mes == 2) and (dias >= 1 and dias <= 29):
    print('Data válida\n')
    if ano_bisx == True:
    print('Esse ano é bissexto')
    elif(ano_bisx == False) and (mes == 2) and (dias >= 1 and dias <= 28):
    print('Data válida\n')
    if ano_bisx == False:
    print('Esse ano não é bissexto')
    elif(ano_bisx == True) and (mes == 2) and (dias >= 1 and dias > 28):
    print('Data invalida')
    elif(ano_bisx == False) and (mes == 2) and (dias >= 1 and dias > 28):
    print('Data invalida')
    dias_biss = dias_bissexto()

    def mes_comuns():
    if (mes in meses_31) and ( dias >= 1 and dias <= 31):
    print('Data válida \n')
    if ano_bisx == True:
    print('Esse ano é bissexto')
    elif (mes in meses_30) and (dias >= 1 and dias <= 30 ):
    print('Data válida \n')
    if ano_bisx == True:
    print('Esse ano é bissexto')
    elif (mes in meses_30) and (dias >= 1 and dias > 30 ):
    print('Data invalida')
    elif (mes in meses_31) and (dias >= 1 and dias > 31 ):
    print('Data invalida')
    mes_com = mes_comuns()

    ResponderExcluir
  5. Há uma falha no código. Números negativos estão passando como válidos. Vejam o que fiz no meu github: https://github.com/laribrito/estruturaDeDecisao

    ResponderExcluir
  6. Segue abaixo o código que fiz:


    print(' ##### DATA #####\n')
    data = input('Digite uma data no formato dd/mm/aaaa: ')
    dia = int(data[0:2])
    mes = int(data[3:5])
    ano = int(data[6:10])

    if len(data) == 10:
    if 0 < ano < 10000:
    if 0 < mes <= 12:
    if mes == 2 and (ano % 4) == 0:
    if 0 < dia <= 29:
    print('Esta é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    elif mes == 2 and (ano % 4) != 0:
    if 0 < dia <= 28:
    print('Esta é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    elif mes == 4 or mes == 6 or mes == 9 or mes == 11:
    if 0 < dia <= 30:
    print('Esta é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    elif mes == 1 or mes == 3 or mes == 5 or mes == 7 or mes == 8 or mes == 10 or mes == 12:
    if 0 < dia <= 31:
    print('Esta é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    else:
    print('Esta não é uma data válida.')
    else:
    print('Esta não é uma data válida.')



    O código funcionou bem, e não encontrei nenhuma brecha, apesar de que posso melhorá-lo em muitas coisas, como na definição de variáveis para deixá-lo mais enxuto.

    ResponderExcluir