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')
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á
ResponderExcluirAcho que não, eu fui pesquisar para tirar a duvida desta parte e encontrei isso:
Excluir"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."
Para funcionar precisa tirar o testafor ano%400!=0
Excluirporque essa REGRA mostra a excessão dos multiplos de 4.
Nos anos multiplos de 400, não é ano bissexto
Para ano bissexto:
Excluirdef eh_ano_bissexto(ano: int):
return (ano % 4 == 0 and ano % 100 != 0) or (ano % 40 == 0)
def eh_ano_bissexto(ano: int):
Excluir"""Escreva aqui em baixo a sua solução"""
return (ano % 4 == 0 and ano % 100 != 0) or (ano % 40 == 0)
Acabei pensando de forma diferente, sera q tem algum hack nesse codigo?
ResponderExcluirdias=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!")
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.
ExcluirOlá.
ResponderExcluirVeja 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
essa foi uma solução que encontrei:
Excluirdia = int(input("Digite um dia: "))
mes = int(input("Digite um mês: "))
ano = int(input("Digite um ano: "))
data = (f'{dia}/{mes}/{ano}')
print(data)
"""Faça um Programa que peça uma data no formato dd/mm/aaaa e determine se a mesma é uma data válida.
ResponderExcluirano 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()
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
ResponderExcluirSó colocar dia > 0
ExcluirEx: if dia > 0 and dia <= 31:
Segue abaixo o código que fiz:
ResponderExcluirprint(' ##### 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.
Esta com erros
ExcluirSó faria uma coisa diferente, na hora do input colocaria apenas uma entrada do tipo: dd/mm/yyy, e depois daria um split pra separar dia, mês e ano
ResponderExcluirdata = input('Digite um data na expressão dd/mm/yyyy ')
dia, mes, ano = map(int, data.split('/'))
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
#se o mês for fevereiro, precisamos saber se ele é Bissexto
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')
thryh
ResponderExcluirdata = input("Digite uma data com a formatação DD/MM/AAAA: ")
ResponderExcluirdia,mes,ano = data.split('/')
d = int(dia)
m = int(mes)
a = int(ano)
if ((a % 4 == 0 and a % 100 != 0) or (a % 400 == 0)) and (m == 2) and (d > 1 and d <= 29):
print(f'A data {data} é válida.')
elif (a % 4 != 0) and (m == 2) and (d > 1 and d <= 28):
print(f'A data {data} é válida.')
elif (m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12) and (d > 1 and d <= 31):
print(f'A data {data} é válida.')
elif (m == 4 or m == 6 or m == 9 or m == 11) and (d > 1 and d <= 30):
print(f'A data {data} é válida.')
else:
print(f'A data {data} é inválida.')
Segue meu código melhorado, ele ainda adiciona se o ano é bissexto e resolve o problema do mês de fevereiro sobre ter apenas 28 dias e corre sem erros, qualquer coisa o codigo esta no meu github
ResponderExcluirhttps://github.com/Z44CK/Z44CK/blob/main/003
data = input('Data:dd/mm/aaaa: ')
dia, mes, ano = map(int, data.split('/'))
bissexto = (ano % 400 == 0) or (ano % 4 == 0) or (ano % 100 != 0)
if (0 < dia <= 31 and
0 < mes <= 12 and
1900 <= ano <= 2099 and
(mes != 2 or (mes == 2 and (0 < dia <= 28 or (dia == 29 and bissexto))))):
print('Data Válida!')
else:
print('Data Inválida!')
Cara, ficou meio grande o meu, eu testei e n achei defeitos, apesar de saber q n tá perfeito foi o melhor q deu pra fazer sozinho
ResponderExcluirdia = int(input("Digite o dia no formato \'dd\':\n"))
mes = int(input("Digite o mes no formato \'mm\':\n"))
ano = int(input("Digite o ano no formato \'aaaa\':\n"))
if (mes == 1 or mes == 3 or mes == 5 or mes == 7 or mes == 8 or mes == 10 or mes == 12) and dia <= 31:
print("data válida!")
elif (mes == 4 or mes == 6 or mes == 9 or mes == 11) and dia <= 30:
print("data válida!")
elif mes == 2:
if ((ano % 4 == 0 and ano % 100 != 0) or ano % 400 == 0) and dia <= 29:
print("data válida!")
else:
print("data inválida")
elif dia <= 28:
print("data válida!")
else:
print("data inválida!")