2013-02-18 76 views
3

我在django中使用了datetime Python模块。如果到期日期小于或等于当前日期的6个月,我期待计算日期。日期未来6个月

我想从当前日期起6个月生成一个日期的原因是设置一个警报,突出显示发生该事件的字段/列。我不知道我的问题是否清楚。我一直在阅读关于timedelta函数,但不能真正把我的头围绕它。我想写一个if语句来确定这个条件。任何人都可以帮助我吗?是Django和Python的新手。

回答

1

如果中“六个月”你的意思是180天,你可以使用:

import datetime 
d = datetime.date.today() 
d + datetime.timedelta(6 * 30) 

或者如果你的意思是实际6个月的日历,你将有来查找calendar module,做每个一些查询月。例如:

import datetime 
import calendar 

def add_6_months(a_date): 
    month = a_date.month - 1 + 6 
    year = a_date.year + month/12 
    month = month % 12 + 1 
    day = min(a_date.day,calendar.monthrange(year, month)[1]) 
    return datetime.date(year, month, day) 
6

有两种做法,一种只是稍微不准确的,一个以不同的方式不准确的:

  • 添加365.25/2天一个datetime.timedelta()(平均每年长度除以二) :

    import datetime 
    sixmonths = datetime.datetime.now() + datetime.timedelta(days=365.25/2) 
    

    这种方法会给你一个6个月的日期时间戳,我们将6个monhs定义为半年(平均)。

  • 使用外部dateutil library,它具有优异的relativedelta类,将基于日历计算,以当前的日期添加6个月:

    import datetime 
    from dateutil.relativedelat import relativedelta 
    sixmonths = datetime.datetime.now() + relativedelta(months=6) 
    

    这种方法会给你一个日期戳6月进入未来,日期的月份部分已经被转发了6,并且它会考虑月份边界,确保不会越过它们。例如,8月30日加6个月变成2月28日或29日(允许闰年)。

演示可能会有帮助。在我的时区,在发布的时间,这相当于:

>>> import datetime 
>>> from dateutil.relativedelta import relativedelta 
>>> now = datetime.datetime.now() 
>>> now 
datetime.datetime(2013, 2, 18, 12, 16, 0, 547567) 
>>> now + datetime.timedelta(days=365.25/2) 
datetime.datetime(2013, 8, 20, 3, 16, 0, 547567) 
>>> now + relativedelta(months=6) 
datetime.datetime(2013, 8, 18, 12, 16, 0, 547567) 

因此,有两种方法之间1和15天小时的时差。

同样的方法很好地工作datetime.date对象了:当应用到只有日期

>>> today = datetime.date.today() 
>>> today 
datetime.date(2013, 2, 18) 
>>> today + datetime.timedelta(days=365.25/2) 
datetime.date(2013, 8, 19) 
>>> today + relativedelta(months=6) 
datetime.date(2013, 8, 18) 

半年timedelta成为teensy不太准确的(增量的5/8天组件已忽略) 。

+0

关于365.25/2方法的不错建议。 – dmg 2013-02-18 11:13:24

+0

非常感谢...这对我很有用。 – roykasa 2013-02-18 11:27:31

+0

在发布之前应该阅读你的文章 - 没有注意到你使用了'dateutil' - 哦! :)伟大的职位,很好解释:) – 2013-02-18 11:28:31

0

我会给Delorean一个严肃的样子。它建立在dateutilpytz之上,以完成你所要求的只是以下内容。

>>> d = Delorean() 
>>> d 
Delorean(datetime=2013-02-21 06:00:21.195025+00:00, timezone=UTC) 
>>> d.next_month(6) 
Delorean(datetime=2013-08-21 06:00:21.195025+00:00, timezone=UTC) 

它考虑到所有dateutil计算以及为时区转换提供和接口。在Delorean对象上获取所需的日期时间简单.datetime

相关问题