如何在Python中无库自定义增加datetime的月份

282 投票
21 回答
477787 浏览
提问于 2025-04-16 06:46

我需要把一个日期时间的月份加一

next_month = datetime.datetime(mydate.year, mydate.month+1, 1)

但是当月份是12的时候,加一就变成了13,这样就会报错“月份必须在1到12之间”。(我本来以为年份会加一)

我想用timedelta来实现这个功能,但它不支持月份这个参数。还有一个叫做relativedelta的Python库,但我不想为了这个功能单独安装它。

另外还有一个用strtotime的解决方案。

time = strtotime(str(mydate));
next_month = date("Y-m-d", strtotime("+1 month", time));

我不想把日期时间转换成字符串再转换成时间,然后再转换回日期时间;所以这也是一个库的使用。

有没有人有简单好用的解决方案,就像使用timedelta一样?

21 个回答

52

这是我的盐:

current = datetime.datetime(mydate.year, mydate.month, 1)
next_month = datetime.datetime(mydate.year + int(mydate.month / 12), ((mydate.month % 12) + 1), 1)

简单又快捷 :)

603

这是一个简单快捷的方法,可以用 dateutil库中的 relativedelta 来给日期加一个月。

from datetime import datetime
from dateutil.relativedelta import relativedelta
    
date_after_month = datetime.today()+ relativedelta(months=1)
print('Today: ',datetime.today().strftime('%d/%m/%Y'))
print('After Month:', date_after_month.strftime('%d/%m/%Y'))
Today:  01/03/2013

After Month: 01/04/2013

注意事项relativedelta(months=1)relativedelta(month=1) 的意思是 不一样的。使用 month=1 会把原来的日期的月份替换成一月,而使用 months=1 则是给原来的日期加一个月。

注意:这需要安装 python-dateutil 模块。如果你使用的是Linux系统,需要在终端运行这个命令来安装它。

sudo apt-get update && sudo pip install python-dateutil

解释:在Python中添加月份值

187

编辑 - 根据你提到的,如果下个月天数少,需要将日期向下取整,这里有一个解决方案:

import datetime
import calendar

def add_months(sourcedate, months):
    month = sourcedate.month - 1 + months
    year = sourcedate.year + month // 12
    month = month % 12 + 1
    day = min(sourcedate.day, calendar.monthrange(year,month)[1])
    return datetime.date(year, month, day)

使用示例:

>>> somedate = datetime.date.today()
>>> somedate
datetime.date(2010, 11, 9)
>>> add_months(somedate,1)
datetime.date(2010, 12, 9)
>>> add_months(somedate,23)
datetime.date(2012, 10, 9)
>>> otherdate = datetime.date(2010,10,31)
>>> add_months(otherdate,1)
datetime.date(2010, 11, 30)

另外,如果你不在乎小时、分钟和秒的话,可以用 date 代替 datetime。如果你需要考虑小时、分钟和秒,就需要修改我的代码,使用 datetime,并把源数据中的小时、分钟和秒复制到结果中。

撰写回答