当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用datetimePython模块计算当前日期六个月的日期?》经验,为你挑选了14个好方法。

我正在使用datetime Python模块.我想计算从当前日期起6个月的日期.有人可以给我一点帮助吗?

我想要从当前日期起6个月生成日期的原因是生成审核日期.如果用户将数据输入系统,则其审核日期为自输入数据之日起6个月.



1> Mahendra..:

我发现这个解决方案很好.(这使用python-dateutil扩展名)

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)


这是正确的解决方案.如果OP要求6年而不是6个月,那么批准的答案将会失败.因此,应该记住,答案越有价值,它们就越普遍.
喜欢这个答案,但不是'6`之前的`+`多余?
是的,+ 6是多余的.它只是作为一个指标.
@sliders_alpha你需要安装python-dateutil包(pip install python-dateutil)
请注意,“ relativedelta”函数还接受“ month”作为参数,该函数基本上替换/设置/修复了通过日期中的month,这与增加多个months完全不同。对于那些想知道该功能是否已被破坏的人们来说,这只是一个警告,因为他们忘记了* month *内额外的* s *。

2> vartec..:

那么,这取决于您从当前日期起6个月的意思.

    使用自然月份:

    (day, month, year) = (day, (month+6)%12, year+(month+6)/12)
    

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

    date += datetime.timedelta(6*30)
    


只是一个快速评论:我认为,对于月份,公式将是(月+ 5)%12 + 1 b/c为6月,你的公式给出0而预期结果是12 ...尽管这个小错误,到我的想法是,你的答案是最能回答问题的答案
如果日期为31,而六个月后的月份不能有31天(大多数月份为31天)会怎样?
您是否可以投入半年定义(183天)加上26周的定义?它有助于将它们集中在一个地方.
Downvote因为第一溶液``(日,月,年)=(一天,(月+ 6)%12,年+(月+ 6)/ 12)``可马车,因为它会产生无效的日期,如``( 2015年3月31日,`` - >``(2016年3月31日)``
与年份相同:应该为年份+(月+ 5)/ 12
30天不是'银行家定义'.有很多方法可以计算利息支付等天数,而基于30/360 :)的几种方法只是其中的一小部分.http://en.wikipedia.org/wiki/Day_count_convention#30.2F360_methods

3> Luka Lopusin..:

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



4> 小智..:

对于月初计算的开始:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

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


这不是评论中上面提到的relativedelta解决方案.使用600+ upvotes继续滚动查找解决方案.

5> Johannes Wei..:

你是什​​么意思'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



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  = d.year + ((( d.month - 1) + x ) / 12 ) 
    return datetime.date( newyear, newmonth, d.day)

但是......这并没有像1月31日+一个月那样解决问题.所以我们回到OP - 添加一个月是什么意思?一个解决方案是回溯直到你到达有效的一天,因为大多数人会认为jan的最后一天,加上一个月,等于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)>>> 



7> dannyman..:

所以,这里有一个例子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)



8> Mike Davies..:

我知道这已经有6个月了,但是如果你要添加一个月,谷歌的答案显示"在python中增加几个月":

import calendar

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

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

这将计算当前月份的天数,并将它们添加到当前日期,使用365/12,如果您的迭代超过日期,则一年中的1/12会导致短/长月问题.



9> Akbar ibrahi..:

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

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



10> kmkaplan..:
import datetime
print (datetime.date.today() + datetime.timedelta(6*365/12)).isoformat()


将这个答案视为可接受的答案是令人讨厌的.对于那些寻求准确解决方案的人,在放弃并解决这个答案之前,向下滚动到`dateutil.relativedelta`.
答案是不正确的.在这一年,有时366天
啊,是的,如果准确性不重要,添加timedelta是一个简单的解决方案!

11> pi...:

只需使用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)或12`.否则,如果您在11月份尝试此操作,则会收到错误消息.:)

12> zgoda..:

Dateutil包具有此类功能的实现.但请注意,这将是天真的,正如其他人已经指出的那样.



13> David Ragazz..:

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



14> 小智..:

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

我认为它也可以使用负数(减去数月),但是我还没有对此进行太多测试。

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有