python time + timedelta等效


Answers:


136

该解决方案位于在问题中提供的链接

datetime.combine(date.today(), time()) + timedelta(hours=1)

完整示例:

from datetime import date, datetime, time, timedelta

dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()

输出:

00:25:00

4
感觉有点像通过不相关信息增强数据的变通方法。如果today()在切换到夏令时的前一天,并且时间范围扩展到不同的时区,会发生什么情况?该代码受语言环境影响吗?
bluenote10年

1
@ bluenote10天真的日期时间对象只是整数个微秒,根据可疑的格里高利历将其细分。换句话说,在任何本地时区的DST转换期间,答案中的代码都可以正常工作。date.today()用于同时支持正负时间增量。date.min将为正时差工作。
jfs

@JFSebastian:令人放心,感谢您的更新。如果应该使用的纯函数具有副作用,这仍然让我感到畏缩。9999年以前的人也不会喜欢;)。
bluenote10年

3
@ bluenote10实用性胜过纯洁。我怀疑datetime.MAXYEAR在9999中会保留9999。–
jfs

10

如果值得在您的项目中添加另一个文件/依赖项,那么我已经编写了一个很小的小类,该类datetime.time具有算术能力。如果您经过午夜,它就会绕来绕去:

>>> from nptime import nptime
>>> from datetime import timedelta
>>> afternoon = nptime(12, 24) + timedelta(days=1, minutes=36)
>>> afternoon
nptime(13, 0)
>>> str(afternoon)
'13:00:00'

可以从PyPi以nptime(“非修整时间”)或在GitHub上获得:https : //github.com/tgs/nptime

该文档位于http://tgs.github.io/nptime/


大。这样可以节省去往日期时间世界和返回世界的往返路程。
切分

6

这有点讨厌,但是:

from datetime import datetime, timedelta

now = datetime.now().time()
# Just use January the first, 2000
d1 = datetime(2000, 1, 1, now.hour, now.minute, now.second)
d2 = d1 + timedelta(hours=1, minutes=23)
print d2.time()

1
+1:用于datetime模块。否则,将需要手动处理“溢出”错误。
jfs

6

解决方法:

t = time()
t2 = time(t.hour+1, t.minute, t.second, t.microsecond)

如果不需要那么多精度,也可以忽略微秒。


是的,很好的答案。我本来应该比较棘手,例如:time()+ timedelta(minutes = 30)
Antonius Common 2009年

s /。t.second /,t.second /
jfs

6
如果那样的t == time(23,59)话,这种方法将行不通。当您添加时1t.hour您会得到ValueError: hour must be in 0..23
jfs

更正了语法错误。对于23:59的情况,问题是计算的真正意图是什么,在这种情况下您真正想要得到的结果是什么。我以为它应该留在同一天(或给出一个错误),否则您通常会把日期时间放在首位……
sth

1
此方法对我造成了错误,因为我要在10月31日前添加1天。因此,您应该使用它为datetime.timedelta(days=1)datetime对象添加一天。您将避免调试土地。
Bobort '16

1

您可以将time()更改为now()使其起作用

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.