我在django中使用了datetime Python模块。如果到期日期小于或等于当前日期的6个月,我期待计算日期。日期未来6个月
我想从当前日期起6个月生成一个日期的原因是设置一个警报,突出显示发生该事件的字段/列。我不知道我的问题是否清楚。我一直在阅读关于timedelta函数,但不能真正把我的头围绕它。我想写一个if语句来确定这个条件。任何人都可以帮助我吗?是Django和Python的新手。
我在django中使用了datetime Python模块。如果到期日期小于或等于当前日期的6个月,我期待计算日期。日期未来6个月
我想从当前日期起6个月生成一个日期的原因是设置一个警报,突出显示发生该事件的字段/列。我不知道我的问题是否清楚。我一直在阅读关于timedelta函数,但不能真正把我的头围绕它。我想写一个if语句来确定这个条件。任何人都可以帮助我吗?是Django和Python的新手。
如果中“六个月”你的意思是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)
有两种做法,一种只是稍微不准确的,一个以不同的方式不准确的:
添加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天组件已忽略) 。
我会给Delorean一个严肃的样子。它建立在dateutil
和pytz
之上,以完成你所要求的只是以下内容。
>>> 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
。
关于365.25/2方法的不错建议。 – dmg 2013-02-18 11:13:24
非常感谢...这对我很有用。 – roykasa 2013-02-18 11:27:31
在发布之前应该阅读你的文章 - 没有注意到你使用了'dateutil' - 哦! :)伟大的职位,很好解释:) – 2013-02-18 11:28:31