2 つのアプローチがあります。1 つはわずかに不正確で、もう 1 つは別の方法で不正確です。
datetime.timedelta()
365.25 / 2 日 (平均年の長さを 2 で割った値)の a を追加します。
import datetime
sixmonths = datetime.datetime.now() + datetime.timedelta(days=365.25/2)
このメソッドは、6 か月先の日時スタンプを提供します。ここで、6 か月は正確に半年 (平均) と定義されます。
外部dateutil
ライブラリrelativedelta
を使用してください。これには、カレンダーの計算に基づいて現在の日付に 6 か月を追加する優れたクラスがあります。
import datetime
from dateutil.relativedelat import relativedelta
sixmonths = datetime.datetime.now() + relativedelta(months=6)
このメソッドは、日付の月コンポーネントが 6 だけ進められた 6 か月先の日時スタンプを提供し、月の境界を考慮して、それらを超えないようにします。たとえば、8 月 30 日と 6 か月を足すと、2 月 28 日または 29 日になります (閏年が許せば)。
デモンストレーションが役立つ場合があります。私のタイムゾーンでは、投稿時点で、これは次のように変換されます。
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2013, 2, 18, 12, 16, 0, 547567)
>>> now + datetime.timedelta(days=365.25/2)
datetime.datetime(2013, 8, 20, 3, 16, 0, 547567)
>>> now + relativedelta(months=6)
datetime.datetime(2013, 8, 18, 12, 16, 0, 547567)
したがって、2 つの方法には 1 日と 15 時間の違いがあります。
同じメソッドがオブジェクトでもうまく機能しdatetime.date
ます:
>>> today = datetime.date.today()
>>> today
datetime.date(2013, 2, 18)
>>> today + datetime.timedelta(days=365.25/2)
datetime.date(2013, 8, 19)
>>> today + relativedelta(months=6)
datetime.date(2013, 8, 18)
半年の timedelta は、日付のみに適用されると、かなり精度が低下します (現在、デルタの 5/8 日コンポーネントは無視されます)。