Calculo de Horas

Olá pessoal!

Estou estudando Python e estou tentando criar um pequeno projeto de calculo de horas. Consegui chegar no total de horas de trabalho em um dia, porém quando tento fazer a subtração de horas trabalhadas pela jornada de horas, da erro. Alguém poderia me dar uma luza de como finalizar este calculo. O código vai até o total de horas trabalhadas. Como eu poderia efetuar uma subtração do total pela jornada que o o usuário determinar? Agradeço desde já!

from datetime import date,datetime,time

inicio = input('Informe o horário de entrada: ')
ini = datetime.strptime(inicio, “%H:%M:%S”)
said_alm = input('Informe o horário de saída para o almoço: ')
sa = datetime.strptime(said_alm, “%H:%M:%S”)
parte1 = sa - ini
print(‘Total de horas da 1ª parte do dia: {}’.format(parte1))

volt_alm = input('\nInforme o horario de volta do almoço: ')
va = datetime.strptime(volt_alm, “%H:%M:%S”)
saida = input('Informe o horário de saída: ')
sd = datetime.strptime(saida, “%H:%M:%S”)
parte2 = sd - va
print(‘Total de horas da 2ª parte do dia: {}’.format(parte2))

total = (parte2 + parte1)
print(‘\nTotal de horas trabalhadas no dia: {}’.format(total))

E qual é a jornada de horas? O usuário vai digitar também? Em qual formato?

Então Hugo…

Eu iria trabalhar com 8h (08:00:00). Porém, tem casos de precisar ser 9h (09:00:00). Para isso, não sei se uma função if resolveria para a escolha de um dos dois. Porém, ainda sim, não conseguiria efetuar a subtração das horas.

É porque a jornada de trabalho é uma duração, não uma data, então tem que usar timedelta em vez de date/datetime.

O chato é que não tem um método pronto como strptime para timedelta, então tem que fazer na mão. Algo como:

# essa parte não muda
from datetime import datetime, timedelta

inicio = input('Informe o horário de entrada: ')
ini = datetime.strptime(inicio, "%H:%M:%S")
said_alm = input('Informe o horário de saída para o almoço: ')
sa = datetime.strptime(said_alm, "%H:%M:%S")
parte1 = sa - ini
print('Total de horas da 1ª parte do dia: {}'.format(parte1))

volt_alm = input('\nInforme o horario de volta do almoço: ')
va = datetime.strptime(volt_alm, "%H:%M:%S")
saida = input('Informe o horário de saída: ')
sd = datetime.strptime(saida, "%H:%M:%S")
parte2 = sd - va
print('Total de horas da 2ª parte do dia: {}'.format(parte2))

total = (parte2 + parte1)
print('\nTotal de horas trabalhadas no dia: {}'.format(total))

###################
# jornada de trabalho
jornada_digitada = '09:00:00' # input(etc) - suponha que o usuário digitou isso
horas, minutos, segundos = map(int, jornada_digitada.split(':'))
jornada = timedelta(hours=horas, minutes=minutos, seconds=segundos)

# agora é só subtrair
print(jornada - total)

Só pra ser mais claro, existem dois conceitos importantes: datas/horas e durações.

  • uma data representa um ponto específico do calendário e um horário representa um momento específico do dia. Ex: a reunião será dia 10/01/2023 às duas horas da tarde (diz exatamente em quando será a reunião)
  • uma duração representa uma quantidade de tempo. Ex: a reunião durou duas horas (eu não disse que dia/hora ela começou ou terminou, só disse quanto tempo ela durou)

O que pode confundir é que tanto horários quanto durações usam as mesmas palavras (horas, minutos e segundos), e muitas vezes são escritos do mesmo jeito (“11:00” pode ser tanto 11 da manhã quanto uma duração de 11 horas). Mas cada um representa um conceito diferente.

Em Python, datas e horas são representadas por date (somente data), datetime (data e hora) e time (somente hora), e durações são representadas por um timedelta.

Se vc subtrai duas datas, o resultado é um timedelta (a quantidade de tempo entre essas datas - ex: a diferença entre 10h00 e 11h30 é de 1 hora de 30 minutos).

Se vc soma ou subtrai um timedelta de uma data, o resultado é outra data (ex: 10h00 mais duas horas é igual a 12h00).

E se vc subtrai dois timedeltas, o resultado é outro timedelta (que é o que foi feito para a jornada - ex: uma duração de 9 horas menos uma duração de 8 horas é igual a uma duração de 1 hora).

Sabendo disso, basta usar os tipos corretos para cada situação.

1 curtida

Perfeito Hugo! Entendi e agradeço muito a explicação. Vou refazer aqui para treinar um pouco mais. Adianto que já consegui o que queria.

Valeu a Força!