您好,我需要一些帮助来了解为什么会发生这种情况。 我有一种方法可以在事件程序中跟踪“剩余时间”:
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
最佳答案
如果您使用的是 Python 2.7 或更高版本,您可以使用 timedelta.total_seconds()
获取 timedelta 的 float
表示为正或负秒数。
>>> datetime.timedelta(-1, 86100).total_seconds()
-300.0
您应该能够使用它来相当容易地计算分钟数。
如果您不使用 Python 2.7,则可以使用文档中的以下等效公式:
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10.0**6
编辑:看起来您可能正在使用 timedelta 的默认字符串表示来显示结果,所以我的原始答案可能没有那么有用。我会建议这样的东西来显示结果:
def get_program_time_budget(self):
td = self.estimated_duration-self.get_program_duration()
if td.days < 0:
return '-' + str(datetime.timedelta() - td)
return str(td)
现在这将返回一个字符串而不是 timedelta,对于负 timedelta,它会在正 timedelta 前添加一个“-”。
关于带有负值的 Python timedelta 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408397/