【问题标题】:Adding days to any date even a leap year将天数添加到任何日期,甚至是闰年
【发布时间】:2020-10-22 00:05:00
【问题描述】:

为任何日期添加天数,甚至二月和闰年(如果有的话)。

这是我的日期:2020-07-08T07:03:08Z

我需要在上面的日期加上一些 if else 条件。

if(month):
    # i need to increment 30/31 days as per the month have 
    next_upcoming_date = 2020-08-07T07:03:08Z
if(year):
    # i need to increment 365/366(when leap year) as per the year 
    next_upcoming_date = 2021-07-07T07:03:08Z

示例:如果 31 日 如果订阅条款为每月 25.99 美元,并且订阅者在 7 月 31 日星期四注册。订阅者的计费方式如下:

Thursday, July 31 = $25.99 USD
Saturday, August 31 = $25.99 USD
Wednesday, October 1= $25.99 USD
Saturday, November 1= $25.99 USD
and so on

示例:如果 30 日 如果订阅条款为每月 25.99 美元,并且订阅者在 12 月 30 日星期二注册,则订阅者的账单如下:

Tuesday, December 30 = $25.99 USD
Friday, January 30 = $25.99 USD
Sunday, March 1= $25.99 USD
Wednesday, April 1= $25.99USD
and so on

请建议我如何实现这一目标。

【问题讨论】:

  • 您知道datetime 模块中的timedelta 吗?您可以简单地说将 timedeltas 添加到日期
  • 对不起..我是新人:(。请原谅
  • 您能否提供更多代码,以便我们可以看到您已经完成的更大范围的工作?目前还不是很清楚你要做什么。
  • 新日期的目标是什么?您是否只是想增加一个月或一年并考虑月份中不同的天数?您可能应该添加更多开始日期和所需结果的示例。

标签: python python-3.x date datetime


【解决方案1】:

dateutil 包提供了一种方便的方法:

from datetime import datetime
from dateutil.relativedelta import relativedelta

# convert string to datetime object:
s = '2020-07-08T07:03:08Z'
dt = datetime.fromisoformat(s.replace('Z', '+00:00'))
# datetime.datetime(2020, 7, 8, 7, 3, 8, tzinfo=datetime.timezone.utc)

# add a month:
dt_plus_month = dt + relativedelta(months=1)
# datetime.datetime(2020, 8, 8, 7, 3, 8, tzinfo=datetime.timezone.utc)

dt_plus_year = dt + relativedelta(years=1)
# datetime.datetime(2021, 7, 8, 7, 3, 8, tzinfo=datetime.timezone.utc)

【讨论】:

  • 这个 relativedelta 库也将处理闰年?
  • @Anonymous:是的,请查看文档的this page
  • 将实施并批准:)
  • 对于这个日期 s = '2020-01-31T07:03:08Z' 并且 aam 获得 o/p 为 2020-02-29 07:03:08+00:00 --> 月。但我想要3月1日。当“s”在 31 日时,日期应该是当月的 1 日。如果初始日期为 29 日或 30 日,则应为次年 2 月的 1 日。
  • 请建议我如何实现这一目标
【解决方案2】:

你能做到的那一年

from re import split

a="2020-08-07T07:03:08Z"
parsed = split("-", a)

if (parsed[0] % 4) == 0:
       print("Leap Year!")
else:
       print("Not Leap Year ):.")

可能有点复杂,但它是纯python

你可以做的月份:

from re import split

a="2020-08-07T07:03:08Z"
parsed = split("-", a)
if parsed[1] in [01, 03, 05, 07, 08, 10, 12]:
           print("31 month!")
else:
           print("30 month ): .")

【讨论】:

    【解决方案3】:

    在 OP 更新问题后,建议如何获得所需的输出。它与原始版本有很大不同,因此我决定将其作为新答案。

    from datetime import datetime
    from calendar import monthrange
    from dateutil.relativedelta import relativedelta
    
    s = '2020-07-31T07:03:08Z'
    dt = datetime.fromisoformat(s.replace('Z', '+00:00'))
    
    for _ in range(6):
        print(dt)
        # first, add a month
        dt += relativedelta(months=1)
        # then analyse the result if it falls on a month with less than 31 days:
        mr = monthrange(dt.year, dt.month)
        if mr[1] < 31 and dt.day != 1: # also check if day==1, leave it at that if so.
            dt += relativedelta(days=1)
        
    # 2020-07-31 07:03:08+00:00
    # 2020-08-31 07:03:08+00:00
    # 2020-10-01 07:03:08+00:00
    # 2020-11-01 07:03:08+00:00
    # 2020-12-01 07:03:08+00:00
    # 2021-01-01 07:03:08+00:00
    
    
    s = '2020-12-30T07:03:08Z'
    dt = datetime.fromisoformat(s.replace('Z', '+00:00'))
    
    for _ in range(6):
        print(dt)
        dt += relativedelta(months=1)
        mr = monthrange(dt.year, dt.month)
        if mr[1] < 31 and dt.day != 1:
            dt += relativedelta(days=1)
            
    # 2020-12-30 07:03:08+00:00
    # 2021-01-30 07:03:08+00:00
    # 2021-03-01 07:03:08+00:00
    # 2021-04-01 07:03:08+00:00
    # 2021-05-01 07:03:08+00:00
    # 2021-06-01 07:03:08+00:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 2017-07-30
      • 2014-09-08
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多