Как я могу рассчитать 3 времени ввода? - PullRequest
0 голосов
/ 07 июля 2019

Я не являюсь носителем английского языка, поэтому заранее прошу прощения за мой английский.Как новичок я хочу создать простую программу, которая рассчитывает время, которое я проработал в течение дня.С 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)

Ответы [ 3 ]

0 голосов
/ 07 июля 2019

Ваша проблема заключается в том, что при вычитании двух datetime объектов (close_to_time и start_to_time) в результате вы получаете объект timedelta, который больше не представляет дату, а длительность между двумя датами (например, числочасов и минут между 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 голосов
/ 07 июля 2019

Предполагая,

  • start_to_time - это время суток , когда вы начали работать
  • lunch_to_time - это продолжительность вашего обеденного перерыва
  • close_to_time - это время суток вы закончили работу

Это должно сработать

def ok(Event = None):
    try:
        start_to_time = datetime.datetime.strptime(str(input_start_time.get()), "%H:%M")
        lunch_duration = str( input_lunch_time.get() )
        lunch_to_time = datetime.timedelta(hours=lunch_duration[0], minutes=lunch_duration[1])
        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)
    return x
0 голосов
/ 07 июля 2019

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

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) )
...