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

给定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) 

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

有关

  • python时间+ timedelta等效

您可以使用带有timedelta完整datetimevariables,并提供一个虚拟date,然后使用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 

你也可以select更具可读性

 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 

正如其他人在这里所说,你可以在整个使用完整的date时间对象:

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

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

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

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

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

感谢@Pax暗黑破坏神,@ bvmou和@Arachnid在整个使用完整的date时间的build议。 如果我必须接受来自外部源的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() 

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

如果值得添加另一个文件/依赖项到你的项目中,我只写了一个小的类来扩展datetime.time和算术能力。 当你午夜过去的时候,它会绕零。 现在“现在几点钟,现在是24小时”会有很多的情况,包括夏令时,闰秒,历史时区变化等等。 但是有时你确实需要这样一个简单的例子,这就是这样做的。

你的例子会写成:

 >>> import datetime >>> import nptime >>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3) nptime(11, 35, 2) 

nptimedatetime.timeinheritance,所以任何这些方法都应该可用。

它可以从PyPi作为nptime (“非迂腐时间”),或在GitHub: https : //github.com/tgs/nptime

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

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

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