Python时间+时间差等价于什么?

100
7个回答

158

您的问题中提供了一个链接:链接,解决方案就在其中。

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

9
这感觉有点像通过无关信息来增强数据的一种解决方法。如果"today()"是在切换到夏令时之前的一天,而时间差又跨越了不同的时区,会发生什么?这段代码受地域设置影响吗? - bluenote10
1
@bluenote10,一个naive datetime对象只是一个微秒整数,根据普通格里高利历进行分解。换句话说,答案中的代码即使在任何本地时区的DST转换期间也可以正常工作。date.today()用于支持正负timedelta。对于正的timedelta,可以使用date.min - jfs
@J.F.Sebastian:这让人感到宽慰,感谢您的更新。如果一个被认为是纯函数的函数具有副作用,这仍然会让我感到不安。来自9999年的人也不会喜欢这种情况;)。 - bluenote10
3
实用性胜过纯粹性。我怀疑datetime.MAXYEAR在9999年仍将保持为9999。 - jfs

14

如果值得向您的项目添加另一个文件 / 依赖项,我刚刚编写了一个扩展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/中。


太好了。这样可以避免来回转换到日期时间世界。 - Joshua Chia

8

解决方法:

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

如果您不需要那么精确的话,也可以省略微秒。


是的,好的回答。 我应该让它更棘手,比如: time() + timedelta(minutes=30) - Antonius Common
7
如果t == time(23,59),那么这个方法不起作用。当你将1加到t.hour时,你会得到一个ValueError: hour must be in 0..23的错误信息。 - jfs
修正了语法错误。对于23:59这种情况,问题是计算的真正意图是什么,在那种情况下你真正想要得到的结果是什么。我认为它应该保持在同一天(或者给出一个错误),否则你通常首先会使用日期时间... - sth
1
这个方法给我带来了一个错误,因为我要给10月31日加上1天。所以你应该使用datetime.timedelta(days = 1)来给一个datetime对象添加一天。这样可以避免调试问题。 - Bobort
尽管这个答案缺少关键信息,但我认为它是最好的“默认”方法。其他答案也缺少关键信息,但它们没有错误,而是隐含着“溢出”到下一个/上一个日期,这可能更加关键(隐藏的难以发现的错误)。在我的使用情况中,这不是我想要的,例如,如果我试图将1小时添加到t == time(23, 59),我希望有time.max - felipou
有一个更简短的表达方式:t2 = t.replace(hour=t.hour+1) - Jakub Kukul

7

这有点过于猥琐了,但是:


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

5

您可以将time()更改为now(),以使其正常工作。

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)

1
有点晚了,但你也可以尝试以下操作: ```html

一些操作步骤:

``` 1.
init_time = time(4,0)
added_time = 8
new_time = datetime.time(init_time.hour+added_time)

请注意,您需要添加纠正代码以确保init+time.hour + added+time不超过23:59。

0
你尝试过使用dateutil包中的relativedelta吗? 它似乎可以很好地解决你的问题。
import datetime
from dateutil import relativedelta

print(datetime.datetime.now() + relativedelta.relativedelta(hours=1))
>>> 2023-05-09 16:35:57.008271

我也用它来操作日期,以下是一些示例:

# going back one month from today
end_date = datetime.date.today() - relativedelta.relativedelta(months=1)
print(end_date)
>>> 2023-04-09

# going back one month from January 2023
end_date = datetime.date(2023,1,1) - relativedelta.relativedelta(months=1)
print(end_date)
>>> 2022-12-01


希望能对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接