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)
それが正しいか?もっと良い方法はありますか?
以下は、標準の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
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日に設定します。
あなたのやり方は良さそうですが、私はこのようにしていたでしょう:
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)