5

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

我想从当前日期生成 6 个月的日期的原因是设置一个警报,以突出显示该事件发生的字段/列。我不知道我的问题是否清楚。我一直在阅读有关 timedelta 函数的信息,但无法真正理解它。我正在尝试编写一个 if 语句来满足这个条件。任何人都可以帮助我吗?我是 django 和 python 的新手。

4

4 回答 4

10

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

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

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

    此方法将为您提供未来 6 个月的日期时间戳,我们将 6 个月定义为正好半年(平均)。

  • 使用外部dateutil,它有一个优秀的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)

当仅应用于日期时,半年时间增量变得不那么准确(现在忽略增量的第 5/8 天部分)。

于 2013-02-18T11:06:52.957 回答
2

如果“6 个月”是指 180 天,您可以使用:

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

或者,如果您按日历表示实际 6 个月,则您必须查找日历模块并在每个月进行一些查找。例如:

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)
于 2013-02-18T11:02:15.233 回答
0

I would give Delorean a look a serious look. It is built on top of dateutil and pytz to do what you asked would simply be the following.

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

It takes into account all the dateutil calculations as well as provide and interface for timezone shifts. to get the needed datetime simple .datetime on the Delorean object.

于 2013-02-21T06:03:06.850 回答
-1

如果您想获得特定的日期,这可能对您有用:

from calendar import datetime

datetime.date(2019,1,1).strftime("%a %d")
#The arguments here are: year, month, day and the method is there to return a formated kind of date - in this case - day of the week and day of the month.

结果将是:星期二 01

希望能帮助到你!

于 2018-07-20T17:39:59.130 回答