python - utc时间戳 - time time单位




在Python中为datetime.time添加N秒的标准方式是什么? (6)

给定Python中的datetime.time值,是否有一种标准的方法来为它添加整数秒,例如11:34:59 + 3 = 11:35:02

这些明显的想法不起作用:

>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'

最后我写了这样的函数:

def add_secs_to_time(timeval, secs_to_add):
    secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
    secs += secs_to_add
    return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)

我不禁想到我错过了一个更简单的方法来做到这一点。

有关


一件小事,可能会增加清晰度以覆盖默认值几秒钟

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)

为了完成的目的,下面是用arrow (Python的更好的日期和时间)来完成它的方法:

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)

尝试将datetime.datetime添加到datetime.timedelta 。 如果只需要时间部分,则可以对生成的datetime.datetime对象调用time()方法来获取它。


您不能简单地将数字添加到datetime因为它不清楚使用的是什么单位:秒,小时,星期......

timedelta类用于处理日期和时间。 datetime减去datetime给出timedeltadatetime加上timedelta给出datetime ,尽管两个timedelta可以,但是不能添加两个datetime对象。

创建timedelta对象,添加多少秒钟并将其添加到datetime对象中:

>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)

在C ++中有相同的概念: std::chrono::duration


感谢@Pax暗黑破坏神,@ bvmou和@Arachnid提出在整个期间使用完整日期时间的建议。 如果我必须接受来自外部源的datetime.time对象,那么这似乎是一个替代add_secs_to_time()函数:

def add_secs_to_time(timeval, secs_to_add):
    dummy_date = datetime.date(1, 1, 1)
    full_datetime = datetime.datetime.combine(dummy_date, timeval)
    added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
    return added_datetime.time()

这个冗长的代码可以压缩到这一行:

(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()

但我认为我想将它包装在一个代码清晰的函数中。


正如其他人在这里所说的,你可以在整个过程中使用完整的日期时间对象

sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

不过,我认为值得解释为什么需要完整的日期时间对象。 考虑一下,如果我在2点到11点之间加入会发生什么。 什么是正确的行为? 例外,因为你的时间不能超过11:59 pm? 它是否应该绕回来?

不同的程序员会期望不同的事情,所以他们选择的结果会让很多人感到惊讶。 更糟糕的是,程序员会编写在最初测试时运行得很好的代码,然后通过做出意想不到的事情来让代码崩溃。 这是非常糟糕的,这就是为什么你不允许将timedelta对象添加到时间对象。





math