嗨,我需要一些帮助来理解为什么会发生这种情况。我有一个方法来跟踪事件程序中的“剩余时间”:
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
当使用estimated_duration > self.get_program_duration()
时,一切都很好,但如果不这样做,事情就会变得有趣起来。
结果将显示给用户:
Estimated 11 hours Allocated 10 hours 55 minutes Remaining 5 minutes
当结果为负时,它会这样做:
Estimated 11 hours Allocated 11 hours 5 minutes Remaining -1 day 23 hours 55 minutes
有什么办法能在5分钟内得到结果吗?
下面是timedelta
格式化程序(注意,这是一个Django过滤器,因此将timedelta
值作为str
接收-但它被存储为timedelta
):
def format_duration(value):
try:
delim = ':'
toks = value.split(',')
hour = minute = ''
d_string = value.count('day') and toks[0] or ''
h, m, s = d_string and toks[-1].strip().split(delim) or value.split(delim)
try:
hour = int(h)
except:
pass
try:
minute = int(m)
except:
pass
h_string = "%s%s%s" % (hour and hour or '', (hour and ' hour' or ''),(hour and hour > 1 and 's' or '') )
m_string = "%s%s%s" % (minute and minute or '', (minute and ' minute' or ''),(minute and minute > 1 and 's' or ''))
return "%s %s %s" % (d_string, h_string, m_string)
except Exception, e:
logging.error("Error in format_duration -> %s. Duration value=%s" % (e, value))
return ''v
发布于 2011-12-07 08:36:32
为什么?
可能是定义//
和%
的方式的意外副作用。
可能是因为它使实现datetime
类变得更容易。纪元前五分钟是23:55,而不是0:-5。
这真的不重要。只需知道这就是days
、seconds
和microseconds
被规范化的方式。而且可以很容易地解决这个问题。
def format_timedelta(td):
if td < timedelta(0):
return '-' + format_timedelta(-td)
else:
# Change this to format positive timedeltas the way you want
return str(td)
>>> format_timedelta(timedelta(minutes=-5))
'-0:05:00'
发布于 2021-07-04 00:18:43
另外,如果您遇到包含负值的timedelta
对象的问题,即使这些值应该是正数,也可以使用pythons内置在abs(td_object)
中
>>> current_time = datetime.datetime.now()
>>> fifteen_seconds = datetime.timedelta(seconds=15)
>>> time_delta_after_calculations = current_time - (current_time + fifteen_seconds) # It should give a timedelta with 15 seconds but it does not
>>> time_delta_after_calculations
datetime.timedelta(days=-1, seconds=86385)
>>> # The above is kind of True but not what expected (A day contains 86400 seconds)
>>> abs(time_delta_after_calculations) # Gives expected output
datetime.timedelta(seconds=15)
https://stackoverflow.com/questions/8408397
复制相似问题