3

指定された日時の前の月の始まりを取得する関数があります。

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を使用しています。

4

1 に答える 1

9

今月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)今月の初めの新しい日付を返します。その後、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)
于 2013-03-21T12:17:05.587 に答える