7
>>> start_date = date(1983, 11, 23)
>>> start_date.replace(month=start_date.month+1)
datetime.date(1983, 12, 23)

これは、月が来るまで、<=11私がやるとすぐに機能します

>>> start_date = date(1983, 12, 23)
>>> start_date.replace(month=start_date.month+1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: month must be in 1..12

12月に新しい月が追加されたときに年をインクリメントする月を追加し続けるにはどうすればよいですか?

4

5 に答える 5

13

dateutilライブラリは、次のような計算に役立ちます。

>>> start_date + relativedelta(months=2)
datetime.date(1984, 1, 23)
于 2012-10-04T21:32:02.683 に答える
5

datetime.timedeltaおよびを使用するcalendar.monthrange

>>> from datetime import date, timedelta
>>> import calendar
>>> start_date = date(1983, 12, 23)
>>> days_in_month = calendar.monthrange(start_date.year, start_date.month)[1]
>>> start_date + timedelta(days=days_in_month)
datetime.date(1984, 1, 23)
于 2012-10-04T21:30:59.437 に答える
4
try:
    start_date.replace(month=start_date.month+1)
except ValueError:
    if start_date.month == 12:
         start_date.replace(month=1)
         start_date.replace(year=start_date.year+1)
    else:
         raise
于 2012-10-04T21:28:33.650 に答える
0

この問題のより一般的な解決策が必要な場合、たとえば、1つの日付に日、月、年を混合して追加する場合:

import time, datetime, calendar
def upcount(dt, years=0, months=0, **kwargs):
    if months:
        total_months = dt.month + months
        month_years, months = divmod(total_months, 12)
        if months == 0:
            month_years -= 1
            months = 12
        years += month_years
    else:
        months = dt.month

    years = dt.year + years
    try:
        dt = dt.replace(year=years, month=months)
    except ValueError:
        # 31st march -> 31st april gives this error
        max_day = calendar.monthrange(years, months)[1]
        dt = dt.replace(year=years, month=months, day=max_day)

    if kwargs:
        dt += datetime.timedelta(**kwargs)
    return dt
于 2012-10-04T21:33:26.620 に答える
0

1月31日+1か月=2月31日(存在しない)のような奇妙なケースにどのように対処するかを決定する必要があります。しかし、私は次のようにタイムデルタを使用して日付を追加することに傾倒します。

import datetime as dt
dt.datetime.now() + dt.timedelta(days=30)

現在または来月のサイズ、またはそのような他の値に基づいて日を選択できるため、翌月がオーバーフローしないようにすることができます。

于 2012-10-04T21:34:15.020 に答える