web-dev-qa-db-ja.com

Pythonで翌月の初日を取得するにはどうすればよいですか?

Pythonで翌月の最初の日付を取得するにはどうすればよいですか?たとえば、現在が2019-12-31の場合、翌月の最初の日は2020-01-01です。現在が2019-08-01の場合、翌月の最初の日は2019-09-01です。

私はこれを思いつきました:

import datetime

def first_day_of_next_month(dt):
    '''Get the first day of the next month. Preserves the timezone.

    Args:
        dt (datetime.datetime): The current datetime

    Returns:
        datetime.datetime: The first day of the next month at 00:00:00.
    '''
    if dt.month == 12:
        return datetime.datetime(year=dt.year+1,
                                 month=1,
                                 day=1,
                                 tzinfo=dt.tzinfo)
    else:
        return datetime.datetime(year=dt.year,
                                 month=dt.month+1,
                                 day=1,
                                 tzinfo=dt.tzinfo)

それが正しいか?もっと良い方法はありますか?

5
Flux

以下は、標準のdatetimeライブラリのみを使用した1行のソリューションです。

(dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)

例:

>>> dt = datetime.datetime(2016, 2, 29)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2016-03-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 31)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 1)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00
1
Toby Petty

dateutil を使用すると、文字通り可能な限り実行できます。

_import datetime
from dateutil import relativedelta
today = datetime.date.today()

next_month = today + relativedelta.relativedelta(months=1, day=1)
_

英語の場合:今日の日付に1か月を追加し、(その月の)日を1に設定します。day(s)month(s)の単数形​​と複数形の使い方に注意してください。単数は属性に値を設定し、複数はピリオドの数を追加します。

この_relativedelta.relativedelta_オブジェクトを変数に格納して渡すことができます。他の答えはより多くのプログラミングロジックを含みます。

[〜#〜] edit [〜#〜]標準のdatetimeライブラリでも実行できますが、そうではありません綺麗な:

_next_month = (today.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)
_

日付を当月の1日に設定し、32日(または31から59の間の任意の数で翌月にジャンプすることを保証)を追加してから、日付をその月の1日に設定します。

1
eumiro

あなたのやり方は良さそうですが、私はこのようにしていたでしょう:

import datetime
from dateutil import relativedelta

dt = datetime.datetime(year=1998,
                             month=12,
                             day=12)

nextmonth = dt + relativedelta.relativedelta(months=1)
nextmonth.replace(day=1)
print(nextmonth)
0
marc