显示带有时间计算的负小时?

问题描述

是否可以显示负数小时? 例如: 如果用户签入和签出并已工作3个小时,但他应至少工作4个小时,则计算(3-4)应得出-1个小时(-01:00)。 但是当我进行此计算时:

checkin = datetime.datetime(1,1,8) # this is 0001-01-01 08:00:00
checkout = datetime.datetime(1,11) # 0001-01-01 11:00:00

should_work = datetime.timedelta(hours=4)
has_worked = checkout - checkin # results in 03:00:00

result = has_worked - should_work # this results into "-1 day,23:00:00" insted of "-01:00"

还有其他用于此类事情的库或日期时间函数吗?

解决方法

timedelta对象的显示格式不是很好。减去1天,再加上23小时 -1小时,但这很尴尬。由于有多种显示增量的方法(例如,您应该允许25小时还是应该是一天?),所以自己进行数学运算是正常的。这只是几个小时和几分钟。多天以小时> = 24表示。

import datetime

def timedelta_str(td):
    s = int(td.total_seconds())
    if s < 0:
        s = abs(s)
        neg = "-"
    else:
        neg = ""
    m,seconds = divmod(s,60)
    hours,minutes = divmod(m,60)
    return f"{neg}{hours:02d}:{minutes:02d}"

checkin = datetime.datetime(1,1,8) # this is 0001-01-01 08:00:00
checkout = datetime.datetime(1,11) # 0001-01-01 11:00:00

should_work = datetime.timedelta(hours=4)
has_worked = checkout - checkin # results in 03:00:00
result = has_worked - should_work

print('result',timedelta_str(result))