2013-03-21 64 views
2

我有一个函数,得到提供的日期时间前一个月开始:搬运月

def get_start_of_previous_month(dt): 
    ''' 
    Return the datetime corresponding to the start of the month 
    before the provided datetime. 
    ''' 
    target_month = (dt.month - 1) 
    if target_month == 0: 
     target_month = 12 
    year_delta = (dt.month - 2)/12 
    target_year = dt.year + year_delta 

    midnight = datetime.time.min 
    target_date = datetime.date(target_year, target_month, 1) 
    start_of_target_month = datetime.datetime.combine(target_date, midnight) 
    return start_of_target_month 

然而,似乎很令人费解。任何人都可以提出更简单的方法吗我正在使用Python 2.4。

回答

7

使用timedelta(days=1)抵消开始的这个月:

import datetime 

def get_start_of_previous_month(dt): 
    ''' 
    Return the datetime corresponding to the start of the month 
    before the provided datetime. 
    ''' 
    previous = dt.date().replace(day=1) - datetime.timedelta(days=1) 
    return datetime.datetime.combine(previous.replace(day=1), datetime.time.min) 

.replace(day=1)返回在当前月份开始的新日期,之后减去一天是要保证我们在前一个月结束。然后我们再次拉同样的把戏,以获得那个月的第一天个月。

(Python的2.4可以肯定的)演示:

>>> get_start_of_previous_month(datetime.datetime.now()) 
datetime.datetime(2013, 2, 1, 0, 0) 
>>> get_start_of_previous_month(datetime.datetime(2013, 1, 21, 12, 23)) 
datetime.datetime(2012, 12, 1, 0, 0)