将timedelta转换为天,小时和分钟

时间:2010-01-22 18:20:39

标签: python timedelta

我有时间。我想要那些日子,小时和分钟 - 无论是作为元组还是字典......我都不会被打扰。

多年来,我必须用十几种语言做了十几次这样的事情,但Python通常对所有内容都有一个简单的答案,所以我想在破坏一些令人作呕的简单(但冗长的)数学之前我会问这里。

Fooz先生提出了一个很好的观点。

我正在处理“列表”(有点像ebay列表),其中每个都有一个持续时间。我正试图通过when_added + duration - now

找到剩下的时间

我是否正确地说这不会占到夏令时?如果没有,添加/减去一小时的最简单方法是什么?

9 个答案:

答案 0 :(得分:276)

如果您有datetime.timedeltatdtd.days已经为您提供了所需的“天数”。 timedelta值将每日分数保持为秒(不是直接小时或分钟),因此您确实必须执行“令人作呕的简单数学”,例如:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

答案 1 :(得分:63)

这个更紧凑,你可以分两行获得小时,分钟和秒。

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

答案 2 :(得分:24)

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

至于DST,我认为最好的办法是将两个datetime个对象转换为秒。这样系统就可以为您计算DST。

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

答案 3 :(得分:6)

我不明白

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

这个怎么样

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

你可以获得一分钟和几分钟的浮动。

答案 4 :(得分:4)

timedeltas有daysseconds属性..您可以轻松自行转换它们。

答案 5 :(得分:3)

对于所有前来寻找实施方案的人:

上述帖子与 datetime.timedelta 相关,遗憾的是它没有小时和秒的属性。到目前为止,还没有提到有一个包含这些的包。你可以在这里找到它:

示例 - 计算:

>>> import timedelta

>>> td = timedelta.Timedelta(days=2, hours=2)

# init from datetime.timedelta
>>> td = timedelta.Timedelta(datetime1 - datetime2)

示例 - 属性:

>>> td = timedelta.Timedelta(days=2, hours=2)
>>> td.total.seconds
180000
>>> td.total.minutes
3000
>>> td.total.hours
50
>>> td.total.days
2

我希望这可以帮助某人...

答案 6 :(得分:1)

我发现最简单的方法是使用str(timedelta)。它将返回格式为3 days, 21:06:40.001000的字符串,并且您可以使用简单的字符串操作或正则表达式来解析小时和分钟。

答案 7 :(得分:0)

我使用了以下内容:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

答案 8 :(得分:0)

这是我汇总的一个小功能,可以做到微秒:

def tdToDict(td:datetime.timedelta) -> dict:
    def __t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = __t(td.seconds, 3600)
    (s, m) = __t(s, 60)    
    (micS, milS) = __t(td.microseconds, 1000)

    return {
         'days': td.days
        ,'hours': h
        ,'minutes': m
        ,'seconds': s
        ,'milliseconds': milS
        ,'microseconds': micS
    }

这是一个返回tuple的版本:

# usage: (_d, _h, _m, _s, _mils, _mics) = tdTuple(td)
def tdTuple(td:datetime.timedelta) -> tuple:
    def _t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = _t(td.seconds, 3600)
    (s, m) = _t(s, 60)    
    (mics, mils) = _t(td.microseconds, 1000)
    return (td.days, h, m, s, mics, mils)