有没有一种简单的方法可以在Python中将datetime对象增加一个月?

时间:2016-01-28 16:19:49

标签: python datetime

所以我试图找到一种方法将datetime对象增加一个月。然而,根据this question,似乎并非如此简单。

我希望有类似的东西:

import datetime as dt

now = dt.datetime.now()
later = now + dt.timedelta(months=1)

但这不起作用。我也希望能够在下个月(如果可能的话)去同一天(或最接近的替代方案)。例如,设置在1月1日的日期时间对象将增加到2月1日,而设置在2月28日的日期时间对象将增加到3月31日而不是3月28日等。

要明确的是,2月28日(通常)将映射到3月31日,因为它是该月的最后一天,因此它应该到下个月的最后一天。否则它将是一个直接链接:增量应该在下一个月的日期与相同的编号日。

在当前版本的Python中有没有一种简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:49)

查看from dateutil.relativedelta import * 为了在日期中添加特定的时间,你可以继续使用timedelta来表示简单的东西,例如。

use_date = use_date + datetime.timedelta(minutes=+10)
use_date = use_date + datetime.timedelta(hours=+1)
use_date = use_date + datetime.timedelta(days=+1)
use_date = use_date + datetime.timedelta(weeks=+1)

或者您可以开始使用relativedelta

use_date = use_date+relativedelta(months=+1)

use_date = use_date+relativedelta(years=+1)

下个月的最后一天:

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)

现在这将提供29/02/2016

下个月的倒数第二天:

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)
use_date = use_date+relativedelta(days=-1)

下个月的上个星期五:

use_date = use_date+relativedelta(months=+1, day=31, weekday=FR(-1))

下个月的第二个星期二:

new_date = use_date+relativedelta(months=+1, day=1, weekday=TU(2))

这绝不是可用内容的详尽清单。 文档可在此处获取:https://dateutil.readthedocs.org/en/latest/

答案 1 :(得分:2)

这个怎么样?

def add_one_month(orig_date):
    # advance year and month by one month
    new_year = orig_date.year
    new_month = orig_date.month + 1
    # note: in datetime.date, months go from 1 to 12
    if new_month > 12:
        new_year += 1
        new_month -= 12

    new_day = orig_date.day
    # while day is out of range for month, reduce by one
    while True:
        try:
            new_date = datetime.date(new_year, new_month, new_day)
        except ValueError as e:
            new_day -= 1
        else:
            break

    return new_date

修改

改进版本:

  1. 如果给出datetime.datetime对象,则保留时间信息
  2. 不使用try / catch,而是使用stdlib中calendar.monthrange模块中的calendar
  3. import datetime
    import calendar
    
    def add_one_month(orig_date):
        # advance year and month by one month
        new_year = orig_date.year
        new_month = orig_date.month + 1
        # note: in datetime.date, months go from 1 to 12
        if new_month > 12:
            new_year += 1
            new_month -= 12
    
        last_day_of_month = calendar.monthrange(new_year, new_month)[1]
        new_day = min(orig_date.day, last_day_of_month)
    
        return orig_date.replace(year=new_year, month=new_month, day=new_day)
    

答案 2 :(得分:0)

问题:在当前版本的Python中是否有一种简单的方法可以做到这一点?

答:在当前版本的Python中没有简单(直接)的方法。

参考:请参阅docs.python.org/2/library/datetime.html,第8.1.2节。 timedelta对象。正如我们可以从中理解的那样,我们不能直接增加月份,因为它不是统一的时间单位。

另外:如果你想要第一天 - >第一天和最后一天 - >最后一天映射你应该分别处理不同月份。

答案 3 :(得分:-4)

>>> now
datetime.datetime(2016, 1, 28, 18, 26, 12, 980861)
>>> later = now.replace(month=now.month+1)
>>> later
datetime.datetime(2016, 2, 28, 18, 26, 12, 980861)

编辑:失败

y = datetime.date(2016, 1, 31); y.replace(month=2) results in ValueError: day is out of range for month

Ther并不是一种简单的方法,但您可以使用自己的功能,如下所示。