首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有负值的Python时间增量问题

具有负值的Python时间增量问题
EN

Stack Overflow用户
提问于 2011-12-07 07:28:17
回答 2查看 53.1K关注 0票数 43

嗨,我需要一些帮助来理解为什么会发生这种情况。我有一个方法来跟踪事件程序中的“剩余时间”:

代码语言:javascript
复制
def get_program_time_budget(self):
    return self.estimated_duration-self.get_program_duration() 

当使用estimated_duration > self.get_program_duration()时,一切都很好,但如果不这样做,事情就会变得有趣起来。

结果将显示给用户:

代码语言:javascript
复制
Estimated   11 hours    Allocated       10 hours 55 minutes     Remaining       5 minutes

当结果为负时,它会这样做:

代码语言:javascript
复制
Estimated   11 hours    Allocated       11 hours 5 minutes  Remaining       -1 day 23 hours 55 minutes

有什么办法能在5分钟内得到结果吗?

下面是timedelta格式化程序(注意,这是一个Django过滤器,因此将timedelta值作为str接收-但它被存储为timedelta):

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

发布于 2011-12-07 08:36:32

为什么?

可能是定义//%的方式的意外副作用。

可能是因为它使实现datetime类变得更容易。纪元前五分钟是23:55,而不是0:-5。

这真的不重要。只需知道这就是dayssecondsmicroseconds被规范化的方式。而且可以很容易地解决这个问题。

代码语言:javascript
复制
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'
票数 26
EN

Stack Overflow用户

发布于 2021-07-04 00:18:43

另外,如果您遇到包含负值的timedelta对象的问题,即使这些值应该是正数,也可以使用pythons内置在abs(td_object)

代码语言:javascript
复制
>>> 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8408397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档