有没有一致的方式列举两个日期之间的天/周/月?

4 投票
1 回答
986 浏览
提问于 2025-04-16 08:15

我有两个datetime对象,一个是开始日期,一个是结束日期。我需要列出这两个日期之间的所有天、周和月,包括开始和结束的日期。

理想情况下,结果应该是datetime格式,不过任何兼容的格式也可以。周和月的表示方式是对应于周/月的第一天,其中星期一是每周的第一天,这符合ISO-8601标准。这意味着结果中可能会包含早于开始日期的日期。

举个例子,如果开始日期是2010年11月28日,结束日期是2010年12月1日,那么结果会是:

天: 2010-11-28, 2010-11-29, 2010-11-30, 2010-12-01

周: 2010-11-22, 2010-11-29

月: 2010-11-01, 2010-12-01

我知道列出天数是比较简单的,但我想要一个干净且一致的解决方案,能够对这三种情况使用类似的方法。看起来calendar模块应该能派上用场,但我还没找到一个好的方法来实现这个目的。

1 个回答

4

使用 dateutil 库:

import datetime
import dateutil.rrule as drrule
import dateutil.relativedelta as drel
import pprint

def dt2d(date):
    '''
    Convert a datetime.datetime to datetime.date object
    '''
    return datetime.date(date.year,date.month,date.day)

def enumerate_dates(start,end):
    days=map(dt2d,drrule.rrule(drrule.DAILY, dtstart=start, until=end))

    # Find the Monday on or before start
    start_week=start+drel.relativedelta(weekday=drel.MO(-1))
    end_week=end+drel.relativedelta(weekday=drel.MO(-1))
    weeks=map(dt2d,drrule.rrule(drrule.WEEKLY, dtstart=start_week, until=end_week))

    # Find the first day of the month
    start_month=start.replace(day=1)
    end_month=end.replace(day=1)
    months=map(dt2d,drrule.rrule(drrule.MONTHLY, dtstart=start_month, until=end_month))
    return days,weeks,months


if __name__=='__main__':
    days,weeks,months=enumerate_dates(datetime.date(2010,11,28),
                                      datetime.date(2010,12,01))
    print('''\
days: {d}
weeks: {w}
months: {m}'''.format(d=map(str,days),w=map(str,weeks),m=map(str,months)))

会得到

days: ['2010-11-28', '2010-11-29', '2010-11-30', '2010-12-01']
weeks: ['2010-11-22', '2010-11-29']
months: ['2010-11-01', '2010-12-01']

撰写回答