如何在不使用库的情况下在 python 中按自定义月份增加日期时间

新手上路,请多包涵

我需要增加日期时间值的月份

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

当月份为 12 时,它变为 13 并引发错误“月份必须在 1..12 中”。 (我预计年份会增加)

我想使用 timedelta,但不需要 month 参数。有 relativedelta python 包,但我不想只为此安装它。还有一个使用 strtotime 的解决方案。

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

我不想从 datetime 转换为 str,然后转换为 time,然后再转换为 datetime;因此,它仍然是一个图书馆

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

原文由 jargalan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 261
2 个回答

编辑-如果下个月的天数较少,则根据您对需要四舍五入的日期的评论,这是一个解决方案:

 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 并将小时、分钟和秒从源复制到结果。

原文由 David Webb 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是使用 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 apt-get install python-dateutil

说明 : 在 python 中添加月份值

原文由 Atul Arvind 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题