Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python时间差问题(具有负值)_Python_Timedelta - Fatal编程技术网

Python时间差问题(具有负值)

Python时间差问题(具有负值),python,timedelta,Python,Timedelta,嗨,我需要一些帮助来理解为什么会发生这种情况。 我有一种跟踪活动计划中“剩余时间”的方法: def get_program_time_budget(self): return self.estimated_duration-self.get_program_duration() 当估计的持续时间>self.get\u program\u duration()时,一切都很好,但当这反过来时,事情就变得有趣了 结果将显示给用户: Estimated 11 hours Alloc

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

def get_program_time_budget(self):
    return self.estimated_duration-self.get_program_duration() 
当估计的持续时间>self.get\u program\u 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):


如果您使用的是Python2.7或更高版本,则可以使用来获得时间增量的
浮点值
表示,表示为正秒数或负秒数

>>> 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)
def获取计划时间预算(自我):
td=self.estimated_duration-self.get_program_duration()
如果td.days<0:
返回'-'+str(datetime.timedelta()-td)
返回str(td)
现在,它将返回一个字符串而不是timedelta,对于负timedelta,它将把“-”前置为正timedelta。

为什么

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

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

这并不重要。只需知道,
微秒
是如何被标准化的。而且它可以很容易地处理

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'
def格式\u时间差(td):
如果td>>格式_timedelta(timedelta(分钟=-5))
'-0:05:00'

这是
timedelta
处理负值的方式。结果总是标准化的,因此只有
值为负值。如果days的值是,比如说,-5,你想否定其他字段吗?我们知道如何减去两个timedelta。我们不知道你用什么代码来显示结果。为了获得更好的建议,请透露。如果您想以理智的方式处理负时间增量值(“-1分钟”只是“-1分钟”,而不是“-1天加23h59”),您可以使用中的
relativetimedelta
模块。谢谢。回答得很好,但我不使用默认的str格式。我有自己的格式化程序(用于剥离秒数等),因此需要一个timedelta,而不是str。我将尝试使用文档中的公式来计算总秒数。在这种情况下,您应该将格式化程序更改为正timedelta,并将其前面的“-”。不幸的是,格式化程序代码是Django筛选器,因此使用timedelta。\uuuStr\uuuuuuuz(或unicode)作为价值观,代码见问题。这是如此简单而天才。非常感谢。
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'