datetime.date + datetime.timedelta = datetime.date是什么

时间:2014-01-06 04:51:45

标签: python datetime

当我跑步时

from datetime import date, time, timedelta
date(2012, 11, 1) + timedelta(0, 3600)

结果是

datetime.date(2012, 11, 1)

为了获得理想的结果,我必须使用联合收割机。

datetime.combine(date(2012, 11, 1), time(0,30))

现在这不是什么大不了的事,但是默默地允许将timedelta添加到某个日期但是然后返回日期而不是日期时间会导致一个微妙的错误,该工具可以追踪一段时间。当然它应该返回日期时间还是抛出?

编辑:我发现dateutil.relativedelta表现得像我期待的那样......。

datetime.date(2013,1,1)+dateutil.relativedelta(minutes=1)
>>datetime.datetime(2013, 1, 1, 0, 1)

这比使用datetime.time的datetime.combine更容易使用,或者将日期转换为日期时间以便为其添加timedelta。

2 个答案:

答案 0 :(得分:3)

Python假设您足够聪明,只能使用引用timedelta对象时整数天的date个对象,因为您显然不关心时间组件

添加返回与任一操作数不同的类型会令人惊讶。您可能认为它类似于1 + 0.5返回1.5,除了结果是第二个操作数的类型。

你会认为有一种简单的方法可以从date转换为datetime,但似乎没有。我可以想到两种方式:

dt = datetime.combine(d, time())

dt = datetime(d.year, d.month, d.day)

转换为datetime后,您可以轻松添加timedelta以获得预期效果。

P.S。我发现最好的策略是假装datetime.datedatetime.time不存在并且仅使用datetime.datetime。不那么令人头痛的话。

答案 1 :(得分:0)

扩展Mark的答案,在任何语义上下文中添加datetime对象是没有意义的,因此Python不允许这样做。

  • 如果我在日期2012-11-01添加10分钟而我只想要一个日期对象,我仍然有2012-11-01

  • 如果我向日期2012-11-01添加10分钟, 360次,并且我在每次迭代后只想要一个日期对象,我仍然会2012-11-01,所以最后我还有2012-11-01

  • 因此,如果我向日期2012-11-01添加3600分钟,即使它是一整天,如果我在每次迭代后只想要一个日期对象,我仍然会2012-11-01

您可以使用datetime来添加分钟到“日期”(不是逗号,因为Python date对象没有时间组件)。但是,您的初始对象具有分钟组件,而datetime对象将为2012-11-01 00:00:00