在 Python 中将 N 秒添加到 datetime.time 的标准方法是什么?

新手上路,请多包涵

给定 datetime.time Python 中的值,是否有一种标准方法可以向其添加整数秒数,以便 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)

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

有关的

原文由 Paul Stephenson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 310
2 个回答

您可以将完整的 datetime 变量与 timedelta 一起使用,并通过提供虚拟日期然后使用 time 来获取时间值。

例如:

 import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print(a.time())
print(b.time())

结果是相隔三秒的两个值:

 11:34:59
11:35:02

您还可以选择更具可读性

b = a + datetime.timedelta(seconds=3)

如果你愿意的话。


如果您正在寻找可以执行此操作的函数,则可以在下面查看使用 addSecs

 import datetime

def addSecs(tm, secs):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(seconds=secs)
    return fulldate.time()

a = datetime.datetime.now().time()
b = addSecs(a, 300)
print(a)
print(b)

这输出:

  09:11:55.775695
 09:16:55

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 from datetime import datetime, date, time, timedelta
sometime = time(8,00) # 8am
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()

但是,我认为有必要解释一下为什么需要完整的日期时间对象。考虑一下如果我在晚上 11 点增加 2 小时会发生什么。什么是正确的行为?一个例外,因为你的时间不能超过晚上 11:59?它应该绕回去吗?

不同的程序员会有不同的期望,所以无论他们选择哪个结果都会让很多人感到惊讶。更糟糕的是,程序员编写的代码在最初测试时工作得很好,然后由于一些意想不到的事情而导致代码崩溃。这非常糟糕,这就是为什么不允许将 timedelta 对象添加到时间对象的原因。

原文由 Eli Courtwright 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题