为什么日期+时间增量变成日期,而不是日期时间?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

在Python中,在混合类型数的运算中,如int+float二次float:

In [57]: 3 + 0.1
Out[57]: 3.1

但为了datetime.date,我们有datetime.date+datetime.timedelta二次datetime.datedatetime.datetime:

In [58]: datetime.date(2013, 1, 1) + datetime.timedelta(seconds=42)
Out[58]: datetime.date(2013, 1, 1)

为什么不断扩大的推理适用于数字,而不适用于date/datetime/timedelta?

提问于
用户回答回答于

timedelta对象不存储任何有关日期或时间的信息。

因此,假设我们有一个人只想操纵日期,而忽略时间,会做一些类似的事情my_new_date = my_old_date + timedelta(days=1)。如果发现my_new_date现在是datetime对象而不是date对象。

用户回答回答于

下列情况下及时向前移动:timedelta.days > 0,或者向后移动,如果timedelta.days < 0...。事后date2 - date1 == timedelta.days...timedelta.secondstimedelta.microseconds

(自date对象是在Python#number0#中添加的。)

如果想要一个行为像datetime.date,但是算术运算返回的地方datetime.datetime对象,那么编写一个对象就不会太困难了:

from datetime import date, datetime, time, timedelta

def _part_day(t):
    """Return True if t is a timedelta object that does not consist of
    whole days.

    """
    return isinstance(t, timedelta) and (t.seconds or t.microseconds)

class mydate(date):
    """Subclass of datetime.date where arithmetic operations with a
    timedelta object return a datetime.datetime object unless the
    timedelta object consists of whole days.

    """
    def datetime(self):
        """Return datetime corresponding to the midnight at start of this
        date.

        """
        return datetime.combine(self, time())

    def __add__(self, other):
        if _part_day(other):
            return self.datetime() + other
        else:
            return super().__add__(other)

    __radd__ = __add__

    def __sub__(self, other):
        if _part_day(other):
            return self.datetime() - other
        else:
            return super().__sub__(other)

扫码关注云+社区