有没有一致的方式列举两个日期之间的天/周/月?
我有两个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']