2017-09-26 146 views
0

除了月之外,有没有办法延长get_month_day_range()函数weekyear开始和结束一段时间

该方法可以定义为get_day_range(period, date)哪个周期可以是weekmonthyear

import datetime 

from dateutil.relativedelta import relativedelta 

def get_month_day_range(date): 
    """ 
    For a date 'date' returns the start and end date for the month of 'date'. 

    Month with 31 days: 
    >>> date = datetime.date(2011, 7, 27) 
    >>> get_month_day_range(date) 
    (datetime.date(2011, 7, 1), datetime.date(2011, 7, 31)) 

    Month with 28 days: 
    >>> date = datetime.date(2011, 2, 15) 
    >>> get_month_day_range(date) 
    (datetime.date(2011, 2, 1), datetime.date(2011, 2, 28)) 
    """ 
    last_day = date + relativedelta(day=1, months=+1, days=-1) 
    first_day = date + relativedelta(day=1) 
    return first_day, last_day 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

我有这样的结果至今:

def get_period_day_range(date, period='month'): 
     last_day = None 
     first_day = date + relativedelta(day=1) 

     if period == 'month': 
      last_day = date + relativedelta(day=1, months=1, days=-1) 
     elif period == 'week': 
      last_day = date + relativedelta(day=1, weeks=1, days=-1) 
     elif period == 'year': 
      last_day = date + relativedelta(day=1, years=1, days=-1) 
     return first_day, last_day 

这不是所有的工作时间。它不适用于weekdatetime.datetime(2017, 7, 10)以及yeardatetime.datetime(2017, 7, 5)。我怎么修复它?有什么建议么?

请注意,函数的目的是为了给我们某个时间段的开始和结束日期,具体取决于我们输入的日期。举例来说,如果我给datetime.datetime(2017年,7,10)年,它会给我(datetime.datetime(2017, 1, 1), datetime.datetime(2017, 12, 31))或一周datetime.datetime(2017, 7, 5)输出为(datetime.datetime(2017, 7, 2), datetime.datetime(2017, 7, 8))

回答

2

你这样做是不对的,仅仅复制上面的代码不看库的文档使用的是(链接:http://dateutil.readthedocs.io/en/stable/relativedelta.html

你需要做这样的事情(未测试):

from dateutil.relativedelta import * 

def get_period_day_range(date, period='month'): 
    if period == 'month': 
     # Then we want day 1 of that month and previous day of the 
     # day 1 of the next month, hence months = 1 (next month) and 
     # days = -1 (previous date) 
     first_day = date + relativedelta(day=1) 
     last_day = date + relativedelta(day=1, months=1, days=-1) 
    elif period == 'week': 
     # Last monday 
     first_day = date + relativedelta(weekday=MO(-1)) 
     # Next sunday 
     last_day = date + relativedelta(weekday=SU) 
    elif period == 'year': 
     # First day of the year, note day and month are singular so they 
     # are not relative terms (read the doc) 
     first_day = date + relativedelta(day=1, month=1) 
     # Last day is always 31 December 
     last_day = date + relativedelta(day=31, month=12) 
    return first_day, last_day