有两种方法,一种只是略有不准确,另一种是不同的方式:
添加datetime.timedelta()365.25/2天(平均年份长度除以2):
import datetime
sixmonths = datetime.datetime.now() + datetime.timedelta(days=365.25/2)
Run Code Online (Sandbox Code Playgroud)
这种方法将在未来6个月给你一个日期时间标记,我们将6个monhs定义为半年(平均).
使用外部dateutil库,它有一个很好的relativedelta类,将根据日历计算添加6个月到您当前的日期:
import datetime
from dateutil.relativedelat import relativedelta
sixmonths = datetime.datetime.now() + relativedelta(months=6)
Run Code Online (Sandbox Code Playgroud)
这种方法将在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)
Run Code Online (Sandbox Code Playgroud)
因此两种方法之间存在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)
Run Code Online (Sandbox Code Playgroud)
当应用于日期时,半年时间delta变得不那么准确(现在忽略delta的第5/8天分量).
如果“6 个月”指的是 180 天,您可以使用:
import datetime
d = datetime.date.today()
d + datetime.timedelta(6 * 30)
Run Code Online (Sandbox Code Playgroud)
或者,如果您指的是日历的实际 6 个月,您将必须查找日历模块并对每个月进行一些查找。例如:
import datetime
import calendar
def add_6_months(a_date):
month = a_date.month - 1 + 6
year = a_date.year + month / 12
month = month % 12 + 1
day = min(a_date.day,calendar.monthrange(year, month)[1])
return datetime.date(year, month, day)
Run Code Online (Sandbox Code Playgroud)