问题描述
是否可以显示负数小时? 例如: 如果用户签入和签出并已工作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))