如何使用 datetime Python 模块计算距当前日期六个月的日期?

Posted

技术标签:

【中文标题】如何使用 datetime Python 模块计算距当前日期六个月的日期?【英文标题】:How do I calculate the date six months from the current date using the datetime Python module? 【发布时间】:2010-10-07 11:24:05 【问题描述】:

我正在使用 datetime Python 模块。我正在寻找从当前日期算起 6 个月的日期。有人可以帮我做这件事吗?

我想生成一个距当前日期 6 个月的日期的原因是为了生成一个审查日期。如果用户将数据输入系统,则从输入数据之日起 6 个月的审核日期。

【问题讨论】:

您必须更具体一点:从 3 月 31 日起六个月是什么时候?从 8 月 30 日开始? 是的,编辑有帮助:这意味着您可以在大约 6 个月到 183 天的时间内没有任何不良影响。因此,将 183 天添加到今天就可以了。 上面的cmets让我觉得很傻。 “增加六个月”的概念非常明确——获取月份组件并将6 添加到其中,如果我们超过 12 月,则支持全年滚动(并将月份循环回1)。这恰好是relativedelta 所做的事情,实际上也是所有支持此类概念的编程语言所做的事情。 @KirkWoll:我相信这很清楚。但对于说话的人来说仍然不同。 Python:date(2015, 3, 31) + relativedelta(months = 6) 给出datetime.date(2015, 9, 30)。 Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6) 给出2000-10-01T00:00:00phpdate_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M')) 给出 2000-10-01。选择你的毒药。 ...添加 182 似乎更适合生成 审核日期:它保持星期几不变。 【参考方案1】:

我发现这个解决方案很好。 (这里使用python-dateutil extension)

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 表示它可能是-6,同样的事情也适用于天和年:) @sliders_alpha 你需要安装python-dateutil包(pip install python-dateutil) 这是正确的解决方案。如果 OP 会要求 6 年而不是 6 个月,那么批准的答案将惨遭失败。所以应该记住,答案越笼统,就越有价值。 请注意relativedelta 函数也接受month 作为参数,它基本上替换/设置/修复传递日期中的月份,这与添加更多月份有很大不同。只是对那些想知道功能是否损坏的人的一个警告,因为他们在 个月 内忘记了额外的 s 我很好奇:有谁知道为什么默认情况下不包含这个?默认情况下,Timedelta 似乎与 datetime 打包在一起。我实际上以为我可以将“几个月”传递给 timedelta。【参考方案2】:

嗯,这取决于您所说的从当前日期算起的 6 个月。

    使用自然月:

    inc = 6
    month = (month + inc - 1) % 12 + 1
    year = year + (month + inc - 1) // 12
    

    使用银行家的定义,6*30:

    date += datetime.timedelta(6 * 30)
    

【讨论】:

你能把半年的定义(183天)加上26周的定义也算进去吗?将它们全部放在一个地方会很有帮助。 只是一个简短的评论:我认为,对于月份,公式将改为 (month + 5) % 12 + 1 b/c for June,您的公式给出 0,而预期结果是 12。 ..尽管有这个小错误,但在我看来,你的答案是最能回答问题的答案 和年一样:应该是年+(月+5)/12 如果日期是 31,而 6 个月后的月份不能有 31 天(大多数月份都是 31 天的情况)怎么办? 投反对票,因为第一个解决方案 (day, month, year) = (day, (month+6)%12, year+(month+6)/12) 可能有问题,因为它会生成无效日期,例如 (31, 8, 2015) -> (31, 2, 2016)【参考方案3】:

使用 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 dateutil.relativedelta import relativedelta。使用 import * 并不明确。 pd.DateOffset 在新的pandasdate = date + pd.DateOffset(months=6) 中完全一样的东西,无需安装dateutil,请参阅帮助【参考方案4】:

对于月初计算:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)

【讨论】:

这不是上面提到的 cmets 中的 relativedelta 解决方案。继续滚动获得 600 多个赞成票的解决方案。【参考方案5】:

所以,这里有一个 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】:

此解决方案在 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  = int(d.year + ((( d.month - 1) + x ) / 12 ))
    return datetime.date( newyear, newmonth, d.day)

但是...这并不能解决像 1 月 31 日 + 一个月这样的问题。所以我们回到 OP - 增加一个月是什么意思?一种解决方案是回溯到有效日期,因为大多数人会假设 1 月的最后一天加上一个月,等于 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)>>> 

【讨论】:

修复了“1月31日+一个月”的问题:days_in_month = calendar.monthrange(newyear, newmonth)[1]; newday = min(d.day, days_in_month); (如果太大,例如 2 月 31 日至 2 月 28 日/29 日,则会影响一天) 这仅对我有用,方法是将 newyear 转换为整数数据类型 def AddMonths(d,x): newmonth = ((( d.month - 1) + x ) % 12 ) + 1 newyear = d.year + int((( d.month - 1) + x ) / 12 ) return datetime.date(newyear, newmonth, d.day)【参考方案7】:

“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的信息

【讨论】:

【参考方案8】:

只需使用 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 个月这样的极端情况。 :)

【讨论】:

代码错误:new_month % 12 应该是 (new_month % 12) or 12。否则,如果您在 11 月尝试此操作,您将收到错误消息。 :) 这实际上比公认的解决方案干净得多。这不需要任何新的导入,只需要基本的数学 return datetime.date(year + (new_month/ / 12), (new_month % 12) or 12, day)【参考方案9】:

使用 Python 的日期时间没有直接的方法。

查看 python-dateutil 的 relativedelta 类型。它允许您以月为单位指定时间增量。

【讨论】:

【参考方案10】:

我知道这是 6 个月,但是如果您要添加一个月,则答案会在 google 中显示为“在 python 中添加几个月”:

import calendar

date = datetime.date.today()    //Or your date

datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])

这将计算当前月份中的天数并将它们添加到当前日期,如果您在日期上进行迭代,使用 365/12 表示一年中的 1/12 可能会导致短/长月份出现问题。

【讨论】:

【参考方案11】:

这没有回答具体问题(仅使用datetime),但是鉴于其他人建议使用不同的模块,这里有一个使用pandas 的解决方案。

import datetime as dt
import pandas as pd

date = dt.date.today() - \
       pd.offsets.DateOffset(months=6)

print(date)

2019-05-04 00:00:00

在闰年按预期工作

date = dt.datetime(2019,8,29) - \
       pd.offsets.DateOffset(months=6)
print(date)

2019-02-28 00:00:00

【讨论】:

【参考方案12】:

使用 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))

【讨论】:

这有一个错误:如果目标月份是 12 月,它将返回比需要晚一年的日期。示例:add_months(datetime.date(2018, 11, 30), 1) 返回datetime.date(2019, 12, 30)(年份应该是 2018,而不是 2019)。因此,最好为此使用经过良好测试的专用库!如果您真的只需要使用标准库模块,请参阅my answer to a similar question。【参考方案13】:

Python 可以使用 datautil 包,请看下面的例子

不仅限于此,您还可以同时传递天、月和年的组合。

import datetime
from dateutil.relativedelta import relativedelta

# subtract months
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_months = proc_dt + relativedelta(months=-3)
print(proc_dt_minus_3_months)

# add months
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_months = proc_dt + relativedelta(months=+3)
print(proc_dt_plus_3_months)

# subtract days:
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_days = proc_dt + relativedelta(days=-3)
print(proc_dt_minus_3_days)

# add days days:
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_days = proc_dt + relativedelta(days=+3)
print(proc_dt_plus_3_days)

# subtract years:
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_years = proc_dt + relativedelta(years=-3)
print(proc_dt_minus_3_years)

# add years:
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_years = proc_dt + relativedelta(years=+3)
print(proc_dt_plus_3_years)

结果:

2021-05-31

2021-11-30

2021-08-28

2021-09-03

2018-08-31

2024-08-31

【讨论】:

"Python 有内置库" -> 不,dateutil 不是 python 标准库的一部分。 @Doug 感谢纠正我,我没有注意到这一点。我很久以前就安装了它。【参考方案14】:

Dateutil package 已实现此类功能。但请注意,正如其他人已经指出的那样,这将是幼稚

【讨论】:

dateutil 很棒。也可以用easy_install安装。 优秀。谢谢你的建议。这似乎是天赐良机。【参考方案15】:

我有更好的方法来解决“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)

我认为它也适用于负数(减去月份),但我没有对此进行太多测试。

【讨论】:

这个答案具有仅使用内置 Python 库正确解决问题的优点。检查 ***.com/a/4131114/302264 以获得等效但稍微更简洁的答案。【参考方案16】:

一个快速的建议是Arrow

pip 安装箭头

>>> import arrow

>>> arrow.now().date()
datetime.date(2019, 6, 28)
>>> arrow.now().shift(months=6).date()
datetime.date(2019, 12, 28)

【讨论】:

使用 .datetime 避免时区(aware / naive)警告:arrow.now().shift(months=6).datetime【参考方案17】:

PyQt4 的 QDate 类有一个 addmonths 函数。

>>>from PyQt4.QtCore import QDate  
>>>dt = QDate(2009,12,31)  
>>>required = dt.addMonths(6) 

>>>required
PyQt4.QtCore.QDate(2010, 6, 30)

>>>required.toPyDate()
datetime.date(2010, 6, 30)

【讨论】:

【参考方案18】:

这个怎么样?不使用其他库 (dateutil) 或 timedelta? 以vartec 的回答为基础,我这样做了,我相信它有效:

import datetime

today = datetime.date.today()
six_months_from_today = datetime.date(today.year + (today.month + 6)/12, (today.month + 6) % 12, today.day)

我尝试使用timedelta,但因为它计算天数,365/26*356/12 并不总是转换为 6 个月,而是 182 天。例如

day = datetime.date(2015, 3, 10)
print day
>>> 2015-03-10

print (day + datetime.timedelta(6*365/12))
>>> 2015-09-08

我相信我们通常假设从某一天开始的 6 个月将在该月的同一天登陆但 6 个月后(即2015-03-10 --> 2015-09-10,不是2015-09-08

希望对您有所帮助。

【讨论】:

day + datetime.timedelta(6*365/12) 并不总是有效,因为有些年份是 365 天,有些年份是 366 天。【参考方案19】:

修改了 AddMonths() 以便在 Zope 中使用并处理无效的日期:

def AddMonths(d,x):
    days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    newmonth = ((( d.month() - 1) + x ) % 12 ) + 1
    newyear  = d.year() + ((( d.month() - 1) + x ) // 12 ) 
    if d.day() > days_of_month[newmonth-1]:
      newday = days_of_month[newmonth-1]
    else:
      newday = d.day() 
    return DateTime( newyear, newmonth, newday)

【讨论】:

这似乎没有考虑闰年(2 月 29 天)。【参考方案20】:
import time

def add_month(start_time, months):  

        ret = time.strptime(start_time, '%Y-%m-%d')
        t = list(ret)

        t[1] += months

        if t[1] > 12:
            t[0] += 1 + int(months / 12)

            t[1] %= 12

        return int(time.mktime(tuple(t)))

【讨论】:

【参考方案21】:

在 1new_month = 121 的情况下修改了 Johannes Wei 的答案。这对我来说非常有效。月份可以是正数也可以是负数。

def addMonth(d,months=1):
    year, month, day = d.timetuple()[:3]
    new_month = month + months
    return datetime.date(year + ((new_month-1) / 12), (new_month-1) % 12 +1, day)

【讨论】:

当开始日期的日期大于目标月份的天数时,它不会“完美运行”。示例:2001-01-31 加上一个月尝试创建日期 2001-02-31。【参考方案22】:
import datetime


'''
Created on 2011-03-09

@author: tonydiep
'''

def add_business_months(start_date, months_to_add):
    """
    Add months in the way business people think of months. 
    Jan 31, 2011 + 1 month = Feb 28, 2011 to business people
    Method: Add the number of months, roll back the date until it becomes a valid date
    """
    # determine year
    years_change = months_to_add / 12

    # determine if there is carryover from adding months
    if (start_date.month + (months_to_add % 12) > 12 ):
        years_change = years_change + 1

    new_year = start_date.year + years_change

    # determine month
    work = months_to_add % 12
    if 0 == work:
        new_month = start_date.month
    else:
        new_month = (start_date.month + (work % 12)) % 12

    if 0 == new_month:
        new_month = 12 

    # determine day of the month
    new_day = start_date.day
    if(new_day in [31, 30, 29, 28]):
        #user means end of the month
        new_day = 31


    new_date = None
    while (None == new_date and 27 < new_day):
        try:
            new_date = start_date.replace(year=new_year, month=new_month, day=new_day)
        except:
            new_day = new_day - 1   #wind down until we get to a valid date

    return new_date


if __name__ == '__main__':
    #tests
    dates = [datetime.date(2011, 1, 31),
             datetime.date(2011, 2, 28),
             datetime.date(2011, 3, 28),
             datetime.date(2011, 4, 28),
             datetime.date(2011, 5, 28),
             datetime.date(2011, 6, 28),
             datetime.date(2011, 7, 28),
             datetime.date(2011, 8, 28),
             datetime.date(2011, 9, 28),
             datetime.date(2011, 10, 28),
             datetime.date(2011, 11, 28),
             datetime.date(2011, 12, 28),
             ]
    months = range(1, 24)
    for start_date in dates:
        for m in months:
            end_date = add_business_months(start_date, m)
            print("%s\t%s\t%s" %(start_date, end_date, m))

【讨论】:

【参考方案23】:

另一个解决方案 - 希望有人会喜欢它:

def add_months(d, months):
    return d.replace(year=d.year+months//12).replace(month=(d.month+months)%12)

此解决方案不适用于所有情况下的第 29、30、31 天,因此需要更强大的解决方案(不再那么好 :)):

def add_months(d, months):
    for i in range(4):
        day = d.day - i
        try:
            return d.replace(day=day).replace(year=d.year+int(months)//12).replace(month=(d.month+int(months))%12)
        except:
            pass
    raise Exception("should not happen")

【讨论】:

【参考方案24】:

来自this answer,参见parsedatetime。代码示例如下。更多详情:unit test with many natural-language -> YYYY-MM-DD conversion examples,显然是parsedatetime conversion challenges/bugs。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, calendar
from datetime import date

# from https://github.com/bear/parsedatetime
import parsedatetime as pdt

def print_todays_date():
    todays_day_of_week = calendar.day_name[date.today().weekday()]
    print "today's date = " + todays_day_of_week + ', ' + \
                              time.strftime('%Y-%m-%d')

def convert_date(natural_language_date):
    cal = pdt.Calendar()
    (struct_time_date, success) = cal.parse(natural_language_date)
    if success:
        formal_date = time.strftime('%Y-%m-%d', struct_time_date)
    else:
        formal_date = '(conversion failed)'
    print '0:12s -> 1:10s'.format(natural_language_date, formal_date)

print_todays_date()
convert_date('6 months')

以上代码从 MacOSX 机器生成以下内容:

$ ./parsedatetime_simple.py 
today's date = Wednesday, 2015-05-13
6 months     -> 2015-11-13
$ 

【讨论】:

【参考方案25】:

这是一个示例,它允许用户决定如何返回一个日期大于该月的天数的日期。

def add_months(date, months, endOfMonthBehaviour='RoundUp'):
    assert endOfMonthBehaviour in ['RoundDown', 'RoundIn', 'RoundOut', 'RoundUp'], \
        'Unknown end of month behaviour'
    year = date.year + (date.month + months - 1) / 12
    month = (date.month + months - 1) % 12 + 1
    day = date.day
    last = monthrange(year, month)[1]
    if day > last:
        if endOfMonthBehaviour == 'RoundDown' or \
            endOfMonthBehaviour == 'RoundOut' and months < 0 or \
            endOfMonthBehaviour == 'RoundIn' and months > 0:
            day = last
        elif endOfMonthBehaviour == 'RoundUp' or \
            endOfMonthBehaviour == 'RoundOut' and months > 0 or \
            endOfMonthBehaviour == 'RoundIn' and months < 0:
            # we don't need to worry about incrementing the year
            # because there will never be a day in December > 31
            month += 1
            day = 1
    return datetime.date(year, month, day)


>>> from calendar import monthrange
>>> import datetime
>>> add_months(datetime.datetime(2016, 1, 31), 1)
datetime.date(2016, 3, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2)
datetime.date(2015, 12, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2, 'RoundDown')
datetime.date(2015, 11, 30)

【讨论】:

【参考方案26】:

假设您的日期时间变量称为日期:

date=datetime.datetime(year=date.year+int((date.month+6)/12),
                       month=(date.month+6)%13 + (1 if (date.month + 
                       months>12) else 0), day=date.day)

【讨论】:

【参考方案27】:

在 x 个月之后/之前获取下一个日期的通用函数。

从日期时间导入日期 def after_month(给定日期,月份): yyyy = int(((given_date.year * 12 + given_date.month) + month)/12) mm = int(((given_date.year * 12 + given_date.month) + month)%12) 如果毫米 == 0: 年年 -= 1 毫米 = 12 return given_date.replace(year=yyyy, month=mm) 如果 __name__ == "__main__": 今天 = date.today() 打印(今天) 对于 [-12, -1, 0, 1, 2, 12, 20 ] 中的 mm: next_date = after_month(今天,毫米) 打印(下一个日期)

【讨论】:

这显然是最好的答案。简单有效,没有四舍五入的问题。【参考方案28】:

我迟到了,但是

查看 Ken Reitz Maya 模块,

https://github.com/kennethreitz/maya

这样的事情可能会对您有所帮助,只需将 hours=1 更改为 days=1 或 years=1

>>> from maya import MayaInterval

# Create an event that is one hour long, starting now.
>>> event_start = maya.now()
>>> event_end = event_start.add(hours=1)

>>> event = MayaInterval(start=event_start, end=event_end)

【讨论】:

也可以使用 Pendulum 模块(Maya 基于 Pendulum)github.com/sdispater/pendulum【参考方案29】:

“python-dateutil”(外部扩展)是一个很好的解决方案,但您可以使用内置 Python 模块(日期时间和日期时间)来实现

我做了一个简短的代码,来解决它(处理年月日)

(运行:Python 3.8.2)

from datetime import datetime
from calendar import monthrange

# Time to increase (in months)
inc = 12

# Returns mod of the division for 12 (months)
month = ((datetime.now().month + inc) % 12) or 1

# Increase the division by 12 (months), if necessary (+ 12 months increase)
year = datetime.now().year + int((month + inc) / 12)

# (IF YOU DON'T NEED DAYS,CAN REMOVE THE BELOW CODE)
# Returns the same day in new month, or the maximum day of new month
day = min(datetime.now().day,monthrange(year, month)[1])

print("Year: , Month: , Day: ".format(year, month, day))

【讨论】:

通过使用“math.floor”而不是“int”,也将支持减少功能【参考方案30】:

我经常需要一个月的最后一天来保持一个月的最后一天。为了解决这个问题,我在计算前加了一天,然后在返回前再次减去。

from datetime import date, timedelta

# it's a lot faster with a constant day
DAY = timedelta(1)

def add_month(a_date, months):
    "Add months to date and retain last day in month."
    next_day = a_date + DAY
    # calculate new year and month
    m_sum = next_day.month + months - 1
    y = next_day.year + m_sum // 12
    m = m_sum % 12 + 1
    try:
        return date(y, m, next_day.day) - DAY
    except ValueError:
        # on fail return last day in month
        # can't fail on december so I don't bother changing the year
        return date(y, m + 1, 1) - DAY

【讨论】:

以上是关于如何使用 datetime Python 模块计算距当前日期六个月的日期?的主要内容,如果未能解决你的问题,请参考以下文章

python--模块之time,datetime时间模块

time模块 | datetime模块 | Python

Python常用模块——time&datetime模块

time模块和datetime模块

python计算两个时间戳相差多少秒

python time模块和datetime模块