如何在python中不使用库按自定义月递增datetime

2024-04-20 08:41:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要增加datetime值的月份

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

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

我想用timedelta,但不需要一个月的争论。 有一个relativedeltapython包,但我不想仅为此安装它。 还有一个使用strtotime的解决方案。

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

我不想从datetime转换成str,再转换成time,再转换成datetime;因此,它还是一个库

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


Tags: datetimedatetime错误解决方案yeartimedeltanext
3条回答

这是我的盐:

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

快速简单:)

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

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

使用dateutil's ^{}将一个月添加到日期中是一个简短而甜蜜的方法。

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)different meanings。通过month=1替换原始日期中的月份到一月,而通过months=1将在原始日期上添加一个月。

注意:这需要python-dateutil。要安装它,您需要在Linux终端上运行。

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

说明:Add month value in python

相关问题 更多 >