当您还没有使用 Python3 并因此无法利用内存高效的 range 对象时,您可以创建一个命名元组,如 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 的方法也可以(其中一种方法在此答案的编辑历史记录中),但通常效率较低,因为它必须在内存中有 all 日期,即使是那些不在路口。