我有一个time。我想要其中的日,小时和分钟-作为元组或字典…我并不大惊小怪。

这些年来,我肯定用十几种语言做过十几次,但Python通常对所有问题都有一个简单的答案,所以我想在抛出一些令人作呕的简单(但冗长)数学之前,在这里问一下。

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

我处理的是“列表”(有点像ebay列表),其中每个列表都有一个持续时间。我试图通过做when_added + duration - now找到剩下的时间

我说的对吗,这不包括夏令时?如果不是,最简单的增加/减少一个小时的方法是什么?


当前回答

这是另一种可能的方法,尽管比前面提到的要冗长一些。对于这种情况,这可能不是最好的方法,但能够以对象中不存储的特定单位(周、小时、分钟、毫秒)获得时间持续时间是很方便的,而且不需要记住或计算转换因子。

from datetime import timedelta
one_hour = timedelta(hours=1)
one_minute = timedelta(minutes=1)
print(one_hour/one_minute)  # Yields 60.0

我有一个time。我想要其中的日,小时和分钟-作为元组或字典…我并不大惊小怪。

in_time_delta = timedelta(days=2, hours=18, minutes=30)
td_d = timedelta(days=1)
td_h = timedelta(hours=1)
td_m = timedelta(minutes=1)
dmh_list = [in_time_delta.days,
            (in_time_delta%td_d)//td_h,
            (in_time_delta%td_h)//td_m]

应该将[2,18,30]分配给dmh_list

其他回答

下面是一个小函数,我把它放在一起,精确到微秒:

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
    }

下面是一个返回元组的版本:

# 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)

如果你有约会时间。时间增量值td td。Days已经给了你想要的“Days”。Timedelta值以秒(而不是直接的小时或分钟)作为一天的分数,所以你确实需要执行“令人作呕的简单数学”,例如:

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

这是另一种可能的方法,尽管比前面提到的要冗长一些。对于这种情况,这可能不是最好的方法,但能够以对象中不存储的特定单位(周、小时、分钟、毫秒)获得时间持续时间是很方便的,而且不需要记住或计算转换因子。

from datetime import timedelta
one_hour = timedelta(hours=1)
one_minute = timedelta(minutes=1)
print(one_hour/one_minute)  # Yields 60.0

我有一个time。我想要其中的日,小时和分钟-作为元组或字典…我并不大惊小怪。

in_time_delta = timedelta(days=2, hours=18, minutes=30)
td_d = timedelta(days=1)
td_h = timedelta(hours=1)
td_m = timedelta(minutes=1)
dmh_list = [in_time_delta.days,
            (in_time_delta%td_d)//td_h,
            (in_time_delta%td_h)//td_m]

应该将[2,18,30]分配给dmh_list

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

对于所有前来寻找实现的人:

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

查看来源:https://github.com/andrewp-as-is/timedelta.py 可通过pip: https://pypi.org/project/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

我希望这能帮助到一些人……