我正在使用datetime Python模块.我想计算从当前日期起6个月的日期.有人可以给我一点帮助吗?
我想要从当前日期起6个月生成日期的原因是生成审核日期.如果用户将数据输入系统,则其审核日期为自输入数据之日起6个月.
我发现这个解决方案很好.(这使用python-dateutil扩展名)
from datetime import date from dateutil.relativedelta import relativedelta six_months = date.today() + relativedelta(months=+6)
这种方法的优点是它可以处理28,30,31天等问题.这在处理业务规则和方案(比如发票生成等)时非常有用.
$ date(2010,12,31)+relativedelta(months=+1) datetime.date(2011, 1, 31) $ date(2010,12,31)+relativedelta(months=+2) datetime.date(2011, 2, 28)
那么,这取决于您从当前日期起6个月的意思.
使用自然月份:
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
使用银行家的定义,6*30:
date += datetime.timedelta(6*30)
使用Python 3.x,您可以这样做:
from datetime import datetime, timedelta from dateutil.relativedelta import * date = datetime.now() print(date) # 2018-09-24 13:24:04.007620 date = date + relativedelta(months=+6) print(date) # 2019-03-24 13:24:04.007620
但是你需要安装python-dateutil模块:
pip install python-dateutil
对于月初计算的开始:
from datetime import timedelta from dateutil.relativedelta import relativedelta end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)
你是什么意思'6个月'.是2009-02-13 + 6个月== 2009-08-13还是2009-02-13 + 6*30天?
import mx.DateTime as dt #6 Months dt.now()+dt.RelativeDateTime(months=6) #result is '2009-08-13 16:28:00.84' #6*30 days dt.now()+dt.RelativeDateTime(days=30*6) #result is '2009-08-12 16:30:03.35'
有关更多信息mx.DateTime
此解决方案适用于12月,本页面上的大多数答案都没有.在使用模数(%)或整数除法(//)之前,您需要先将月份从基数1(即Jan = 1)转移到基数0(即Jan = 0),否则11月(11)加1个月会给出12 ,当找到余数(12%12)给出0.
(并且不建议"(月%12)+ 1"或10月+ 1 = 12月!)
def AddMonths(d,x): newmonth = ((( d.month - 1) + x ) % 12 ) + 1 newyear = d.year + ((( d.month - 1) + x ) / 12 ) return datetime.date( newyear, newmonth, d.day)
但是......这并没有像1月31日+一个月那样解决问题.所以我们回到OP - 添加一个月是什么意思?一个解决方案是回溯直到你到达有效的一天,因为大多数人会认为jan的最后一天,加上一个月,等于2月的最后一天.这也将在负数月份工作.证明:
>>> import datetime >>> AddMonths(datetime.datetime(2010,8,25),1) datetime.date(2010, 9, 25) >>> AddMonths(datetime.datetime(2010,8,25),4) datetime.date(2010, 12, 25) >>> AddMonths(datetime.datetime(2010,8,25),5) datetime.date(2011, 1, 25) >>> AddMonths(datetime.datetime(2010,8,25),13) datetime.date(2011, 9, 25) >>> AddMonths(datetime.datetime(2010,8,25),24) datetime.date(2012, 8, 25) >>> AddMonths(datetime.datetime(2010,8,25),-1) datetime.date(2010, 7, 25) >>> AddMonths(datetime.datetime(2010,8,25),0) datetime.date(2010, 8, 25) >>> AddMonths(datetime.datetime(2010,8,25),-12) datetime.date(2009, 8, 25) >>> AddMonths(datetime.datetime(2010,8,25),-8) datetime.date(2009, 12, 25) >>> AddMonths(datetime.datetime(2010,8,25),-7) datetime.date(2010, 1, 25)>>>
所以,这里有一个例子dateutil.relativedelta
,我发现它有用于迭代过去一年,每次跳过一个月到现在的日期:
>>> import datetime >>> from dateutil.relativedelta import relativedelta >>> today = datetime.datetime.today() >>> month_count = 0 >>> while month_count < 12: ... day = today - relativedelta(months=month_count) ... print day ... month_count += 1 ... 2010-07-07 10:51:45.187968 2010-06-07 10:51:45.187968 2010-05-07 10:51:45.187968 2010-04-07 10:51:45.187968 2010-03-07 10:51:45.187968 2010-02-07 10:51:45.187968 2010-01-07 10:51:45.187968 2009-12-07 10:51:45.187968 2009-11-07 10:51:45.187968 2009-10-07 10:51:45.187968 2009-09-07 10:51:45.187968 2009-08-07 10:51:45.187968
和其他答案一样,你必须在"6个月后"找出你的真正含义.如果你的意思是"未来六个月的今天这个月",那么这样做:
datetime.datetime.now() + relativedelta(months=6)
我知道这已经有6个月了,但是如果你要添加一个月,谷歌的答案显示"在python中增加几个月":
import calendar date = datetime.date.today() //Or your date datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])
这将计算当前月份的天数,并将它们添加到当前日期,使用365/12,如果您的迭代超过日期,则一年中的1/12会导致短/长月问题.
使用Python的日期时间没有直接的方法.
查看python-dateutil中的relativedelta类型.它允许您指定以月为单位的时间增量.
import datetime print (datetime.date.today() + datetime.timedelta(6*365/12)).isoformat()
只需使用timetuple方法提取月份,添加月份并构建新的日期对象.如果有一个已经存在的方法,我不知道.
import datetime def in_the_future(months=1): year, month, day = datetime.date.today().timetuple()[:3] new_month = month + months return datetime.date(year + (new_month / 12), (new_month % 12) or 12, day)
API有点笨拙,但作为一个例子.显然也不会像2008-01-31 + 1个月那样在角落案件上工作.:)
Dateutil包具有此类功能的实现.但请注意,这将是天真的,正如其他人已经指出的那样.
使用Python标准库,即没有dateutil
或其他人,并解决'2月31日'问题:
import datetime import calendar def add_months(date, months): months_count = date.month + months # Calculate the year year = date.year + int(months_count / 12) # Calculate the month month = (months_count % 12) if month == 0: month = 12 # Calculate the day day = date.day last_day_of_month = calendar.monthrange(year, month)[1] if day > last_day_of_month: day = last_day_of_month new_date = datetime.date(year, month, day) return new_date
测试:
>>>date = datetime.date(2018, 11, 30) >>>print(date, add_months(date, 3)) (datetime.date(2018, 11, 30), datetime.date(2019, 2, 28)) >>>print(date, add_months(date, 14)) (datetime.date(2018, 12, 31), datetime.date(2020, 2, 29))
我有一个更好的方法来解决“ 2月31日”问题:
def add_months(start_date, months): import calendar year = start_date.year + (months / 12) month = start_date.month + (months % 12) day = start_date.day if month > 12: month = month % 12 year = year + 1 days_next = calendar.monthrange(year, month)[1] if day > days_next: day = days_next return start_date.replace(year, month, day)
我认为它也可以使用负数(减去数月),但是我还没有对此进行太多测试。