【问题标题】:Date 6 months into the future未来 6 个月的日期
【发布时间】:2013-02-02 18:47:48
【问题描述】:

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

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

【问题讨论】:

    标签: python django date datetime python-datetime


    【解决方案1】:

    如果“6 个月”是指 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)
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      • 使用外部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)
      

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

      【讨论】:

      • 关于 365.25 / 2 方法的好建议。
      • 在我发帖之前应该阅读你的帖子 - 没有注意到你使用了dateutil - 哦,好吧! :) 很棒的帖子,解释得很好:)
      • 嗯,不错。更新链接:github.com/dateutil/dateutil
      【解决方案3】:

      我会认真地看看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

      【讨论】:

        【解决方案4】:

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

        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

        希望对你有帮助!

        【讨论】:

        • 这个答案并没有真正解决大部分问题
        • 嘿,Marcucciboy2,公平点。我只是在之前提出的其他选项之间放置了一个要考虑的选项。干杯,伙计!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 2021-04-13
        相关资源
        最近更新 更多