当您还没有使用Python3并且因此无法使用内存高效的range对象时,您可以创建一个namedtuple,如the answer you link to所示(否则您也可以使用新的range对象)。
从这里开始,您只需对重叠的日期范围使用datetime.date.fromordinal:>>> from datetime import date
>>> from collections import namedtuple
>>> Range = namedtuple('Range', ['start', 'end'])
>>> r1 = Range(start=date(2016, 1, 1), end=date(2016, 2, 5))
>>> r2 = Range(start=date(2016, 1, 28), end=date(2016, 2, 28))
>>> latest_start = max(r1.start, r2.start)
>>> earliest_end = min(r1.end, r2.end)
>>> overlap = (earliest_end - latest_start).days + 1
>>> overlapping_dates = [] # default
>>> if overlap > 0:
... overlapping_dates = range(latest_start.toordinal(), earliest_end.toordinal() + 1) # as numbers
... overlapping_dates = [ date.fromordinal(x) for x in overlapping_dates ] # back to datetime.date objects
...
>>> overlapping_dates
[datetime.date(2016, 1, 28),
datetime.date(2016, 1, 29),
datetime.date(2016, 1, 30),
datetime.date(2016, 1, 31),
datetime.date(2016, 2, 1),
datetime.date(2016, 2, 2),
datetime.date(2016, 2, 3),
datetime.date(2016, 2, 4),
datetime.date(2016, 2, 5)]
使用set的方法也可以工作(其中一种方法在这个答案的编辑历史中),但通常效率较低,因为它必须在内存中有所有日期,即使那些不在交集中的日期也是如此。在