首页 文章

是否有一致的方法来计算两个日期之间的天/周/月?

提问于
浏览
4

我有两个 datetime 对象;开始日期和结束日期 . 我需要列举两者之间的日,周和月,包括在内 .

理想情况下,结果将是 datetime 形式,但任何兼容的形式都可以 . 周和月由对应于星期/月的第一天的日期表示,其中星期一是一周的第一天,如ISO-8601中所示 . 这意味着结果可能包含早于开始日期的日期 .

例如,鉴于2010-11-28至2010-12-01,结果将如下:

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

我意识到日期列表本身很简单,但我想要一个干净,一致的解决方案,对所有这三个方法使用类似的方法 . 似乎 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']
    

相关问题