top of page

Calculadora de datas com Python

Atualizado: 10 de jun.

Eu estava precisando subtrair alguns meses de uma data específica e encontrei este site: Calculadora de datas e fiz o desafio de desenvolver em python a mesma lógica do site para treinar.






import tkinter as tk
from tkinter import messagebox
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta # pip install python-dateutil

def adicionar_subtrair_tempo():
    data_input = entry_data.get()
    tempo = entry_tempo.get()
    operacao = entry_operacao.get()

    try:
        data = datetime.strptime(data_input, "%Y/%m/%d").date()
        quantidade = int(tempo)
        
        if operacao == "Adição":
            if combo_tempo.get() == "Anos":
                nova_data = data + relativedelta(years=quantidade)
            elif combo_tempo.get() == "Meses":
                nova_data = data + relativedelta(months=quantidade)
            else:
                nova_data = data + timedelta(days=quantidade)
        else:
            if combo_tempo.get() == "Anos":
                nova_data = data - relativedelta(years=quantidade)
            elif combo_tempo.get() == "Meses":
                nova_data = data - relativedelta(months=quantidade)
            else:
                nova_data = data - timedelta(days=quantidade)
        
        messagebox.showinfo("Resultado", f"A nova data é: {nova_data.strftime('%d/%m/%Y')}")
        # Limpar os dados do formulário
        entry_data.delete(0, tk.END)
        entry_tempo.set("1")
        entry_operacao.set("Adição")
    except ValueError:
        messagebox.showerror("Erro", "Formato de data inválido. Utilize o formato yyyy/mm/dd.")
        # Limpar os campos de entrada
        entry_data.delete(0, tk.END)
        entry_tempo.set("1")
    except Exception as e:
        messagebox.showerror("Erro", f"Ocorreu um erro: {e}")

# Criar a janela principal
root = tk.Tk()
root.title("Calculadora de tempo")

# Estilizar a interface
root.configure(bg="black")
tk.Label(root, text="Calculadora de tempo", bg="black", fg="pink", font=("Arial", 16)).grid(row=0, column=0, columnspan=3, padx=10, pady=10)

# Criar os campos de entrada e rótulos

label_operacao = tk.Label(root, text="Operação:", anchor="w", bg="black", fg="pink")
label_operacao.grid(row=1, column=0, padx=10, pady=5, sticky="w")
entry_operacao = tk.StringVar(root)
entry_operacao.set("Adição")
radio_adicao = tk.Radiobutton(root, text="Adição", variable=entry_operacao, value="Adição", anchor="w", bg="black", fg="pink", selectcolor="darkred")
radio_adicao.grid(row=1, column=1, padx=10, pady=5, sticky="w")
radio_subtracao = tk.Radiobutton(root, text="Subtração", variable=entry_operacao, value="Subtração", anchor="w", bg="black", fg="pink", selectcolor="darkred")
radio_subtracao.grid(row=1, column=2, padx=(0, 5), pady=5, sticky="w")  # Ajuste aqui

label_data = tk.Label(root, text="Digite uma data (yyyy/mm/dd):", anchor="w", bg="black", fg="pink")
label_data.grid(row=2, column=0, padx=10, pady=5, sticky="w")
entry_data = tk.Entry(root)
entry_data.grid(row=2, column=1, padx=10, pady=5, sticky="w")

label_tempo = tk.Label(root, text="Unidade de Tempo:", anchor="w", bg="black", fg="pink")
label_tempo.grid(row=3, column=0, padx=10, pady=5, sticky="w")
combo_tempo = tk.StringVar(root)
combo_tempo.set("Dias")
combo_tempo_dropdown = tk.OptionMenu(root, combo_tempo, "Anos", "Meses", "Dias")
combo_tempo_dropdown.grid(row=3, column=1, padx=10, pady=5, sticky="w")

label_tempo = tk.Label(root, text="Quantidade para adicionar ou subtrair:", anchor="w", bg="black", fg="pink")
label_tempo.grid(row=4, column=0, padx=10, pady=5, sticky="w")
entry_tempo = tk.StringVar(root)
entry_tempo.set("1")
entry_tempo_dropdown = tk.OptionMenu(root, entry_tempo, *range(1, 1001))
entry_tempo_dropdown.grid(row=4, column=1, padx=10, pady=5, sticky="w")  # Alteração aqui

# Botão para calcular
btn_calcular = tk.Button(root, text="Calcular", command=adicionar_subtrair_tempo, bg="black", fg="pink")
btn_calcular.grid(row=5, column=2, padx=10, pady=5, sticky="e")  # Alteração aqui

# Executar a interface
root.mainloop()


Utilizando pelo terminal do Vscode:

from datetime import date, timedelta, datetime
from dateutil.relativedelta import relativedelta  # pip install python-dateutil

def calcular_diferenca_tempo(data1, data2, tempo):
    if tempo == "1":  # Anos
        diferenca_anos = data1.year - data2.year
        if data1.month < data2.month or (data1.month == data2.month and data1.day < data2.day):
            diferenca_anos -= 1
        return f"{diferenca_anos} anos"
    elif tempo == "2":  # Meses
        diferenca_anos = data1.year - data2.year
        diferenca_meses = data1.month - data2.month
        diferenca_total = diferenca_anos * 12 + diferenca_meses
        return f"{diferenca_total} meses"
    elif tempo == "3":  # Dias
        diferenca = data1 - data2
        return f"{diferenca.days} dias"

def adicionar_tempo(data_input, tempo, adicao):
    data = datetime.strptime(data_input, "%Y/%m/%d").date()
    
    if tempo == "1":
        nova_data = data + relativedelta(years=adicao)
        return f"Adicionado {adicao} anos: {nova_data.strftime('%d/%m/%Y')}"
    elif tempo == "2":
        nova_data = data + relativedelta(months=adicao)
        return f"Adicionado {adicao} meses: {nova_data.strftime('%d/%m/%Y')}"
    elif tempo == "3":
        nova_data = data + timedelta(days=adicao)
        return f"Adicionado {adicao} dias: {nova_data.strftime('%d/%m/%Y')}"

def subtrair_tempo(data_input, tempo, subtracao):
    data_atual = datetime.strptime(data_input, "%Y/%m/%d").date()
    if tempo == "1":  # Anos
        nova_data = data_atual - relativedelta(years=subtracao)
        return f"Subtraído {subtracao} anos: {nova_data.strftime('%d/%m/%Y')}"
    elif tempo == "2":  # Meses
        nova_data = data_atual - relativedelta(months=subtracao)
        return f"Subtraído {subtracao} meses: {nova_data.strftime('%d/%m/%Y')}"
    elif tempo == "3":  # Dias
        nova_data = data_atual - timedelta(days=subtracao)
        return f"Subtraído {subtracao} dias: {nova_data.strftime('%d/%m/%Y')}"

while True:    
    operacao = int(input("Escolha uma das opções:\n[1] - adição\n[2] - subtração\n"))
    tempo = input("Escolha o que você deseja alterar:\n[1] - Anos\n[2] - Meses\n[3] - Dias: ")

    if operacao == 1:
        adicao = int(input("Digite a quantidade para adicionar: "))
        data_input = input("Digite a data no formato: yyyy/mm/dd (ano, mês, dia): ")
        print(adicionar_tempo(data_input, tempo, adicao))
        
    elif operacao == 2:
        subtracao = int(input("Digite a quantidade para subtrair: "))
        data_input = input("Digite a data no formato: yyyy/mm/dd (ano, mês, dia): ")
        print(subtrair_tempo(data_input, tempo, subtracao))

    perg = input('Deseja continuar? [S/N]: ').upper().strip()[0]
    if perg == 'N':
        break

Posts recentes

Ver tudo

xlsx em csv

Quando preciso subir um arquivo em excel para meu banco de dados, o caminho mais fácil é converter o arquivo em excel xlsx para csv....

bottom of page