Я не являюсь носителем английского языка, поэтому заранее прошу прощения за мой английский. Как новичок я хочу создать простую программу, которая рассчитывает время, которое я проработал в течение дня. С Tkinter я до сих пор создал 3 записи (время начала, обеденный перерыв, время окончания), для каждой из которых требуется один ввод времени (% H:% M) и кнопка «все в порядке». Когда я нажимаю кнопку «ОК», она должна рассчитать разницу между временем начала и окончания, а затем вычесть ее из времени обеда. Проблема в том, что я могу только рассчитать разницу между временем начала и окончания. это дает мне предупреждение:

"Expected type 'delta', got datetime instead"

Если я запускаю программу, я получаю это:

"TypeError: unsupported operand type(s) for -: 'datetime.timedelta' and 'datetime.datetime'"

.

import datetime

def ok(Event = None):
    try:
        start_to_time = datetime.datetime.strptime(str(input_start_time.get()), "%H:%M")
        lunch_to_time = datetime.datetime.strptime(str(input_lunch_time.get()), "%H:%M")
        close_to_time = datetime.datetime.strptime(str(input_closing_time.get()), "%H:%M")
    x = close_to_time - start_to_time -lunch_to_time


    print(x)
0
leo_bo98 7 Июл 2019 в 20:37

2 ответа

Лучший ответ

У вас может быть две ситуации

x = (work_stop - work_start) - (lunch_stop - lunch_start)

Но для обеда нужны две ценности

Или же

x = (work_stop - work_start) - time_spend_on_lunch

Но здесь time_spend_on_lunch_start должен быть timedelta вместо datetime


Пример 1

import datetime

work_start = datetime.datetime.strptime("8:00", "%H:%M")
work_stop =  datetime.datetime.strptime("16:00", "%H:%M")

lunch_start = datetime.datetime.strptime("12:00", "%H:%M")
lunch_stop  = datetime.datetime.strptime("13:30", "%H:%M")

x = (work_stop - work_start) - (lunch_stop - lunch_start)

print(x)

Пример 2

import datetime

work_start = datetime.datetime.strptime("8:00", "%H:%M")
work_stop =  datetime.datetime.strptime("16:00", "%H:%M")

time = "1:30"
time = time.split(':')
time = [int(x) for x in time]

time_spend_on_lunch = datetime.timedelta(hours=time[0], minutes=time[1])

x = (work_stop - work_start) - time_spend_on_lunch

print(x)

Вы также можете определить midnight для преобразования datetime в timedelta

import datetime

midnight = datetime.datetime.strptime("0:00", "%H:%M")

time = "1:30"
time = datetime.datetime.strptime(time, "%H:%M")

time_spend_on_lunch = time - midnight

print( time_spend_on_lunch )
print( type(time_spend_on_lunch) )
0
furas 7 Июл 2019 в 18:30

Ваша проблема в том, что когда вы вычитаете два datetime объекта (close_to_time и start_to_time), в результате вы получаете объект timedelta, который больше не представляет дату, а длительность между 2 даты (например, количество часов и минут между close_to_time и start_to_time).

Вы можете только вычесть datetimes из datetimes и timedeltas из timedeltas, и результатом всегда будет timedelta. Поскольку количество времени, которое вы берете на обед, будет не конкретным, а периодом времени, лучше подходить, чтобы быть представленным timedelta, который вы могли бы получить, вычитая время начала обеда из конца обеда время вроде так:

start_to_time = datetime.datetime.strptime(str(input_start_time.get()), "%H:%M")
lunch_start_to_time = datetime.datetime.strptime(str(input_lunch_start_time.get()), "%H:%M")
lunch_end_to_time = datetime.datetime.strptime(str(input_lunch_end_time.get()), "%H:%M")
close_to_time = datetime.datetime.strptime(str(input_closing_time.get()), "%H:%M")

opening_duration = close_to_time - start_to_time
lunch_duration = lunch_end_to_time - lunch_start_to_time

work_duration = opening_duration - lunch_duration

print(work_duration)

Конечно, в этом случае вам нужно будет узнать время начала и окончания обеда на входе.

0
illesguy 7 Июл 2019 в 18:13