Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为任何日期(甚至闰年)添加天数_Python_Python 3.x_Date_Datetime - Fatal编程技术网

Python 为任何日期(甚至闰年)添加天数

Python 为任何日期(甚至闰年)添加天数,python,python-3.x,date,datetime,Python,Python 3.x,Date,Datetime,在任何日期添加天数,甚至在二月和闰年(如果有的话)也添加天数 这是我的日期:2020-07-08T07:03:08Z 我需要在上述日期的基础上增加天数,如果有其他条件的话 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(whe

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

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

我需要在上述日期的基础上增加天数,如果有其他条件的话

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
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
示例:如果30 如果认购条款为每月25.99美元,且认购人在12月30日星期二注册,则认购人的账单如下:

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
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
请建议我如何做到这一点。

该软件包提供了一种方便的方法:

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)

这一年你能做什么

来自重新导入拆分的

a=“2020-08-07T07:03:08Z”
解析=拆分(“-”,a)
如果(已解析[0]%4)==0:
打印(“闰年!”)
其他:
打印(“非闰年):)
可能有点复杂,但它是纯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 ): .")

这里有一个建议,在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
从日期时间导入日期时间
从日历导入monthrange
从dateutil.relativedelta导入relativedelta
s='2020-07-31T07:03:08Z'
dt=日期时间。从isoformat(s.replace('Z','+00:00'))
对于范围(6)内的uu:
打印(dt)
#首先,加上一个月
dt+=相对寿命(月=1)
#然后分析结果,如果它落在少于31天的一个月内:
mr=monthrange(dt.年,dt.月)
如果mr[1]<31且dt.day!=1:#同时检查day==1,如果是,则保持该状态。
dt+=relativedelta(天数=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=日期时间。从isoformat(s.replace('Z','+00:00'))
对于范围(6)内的uu:
打印(dt)
dt+=相对寿命(月=1)
mr=monthrange(dt.年,dt.月)
如果mr[1]<31且dt.day!=1:
dt+=relativedelta(天数=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

您是否知道
datetime
模块中的
timedelta
?你可以简单地说将时间增量添加到日期中对不起。。我是新国际展览局的:(.请原谅,您是否可以提供更多的代码,以便我们可以看到您已经完成的工作的更大范围?您正在尝试做什么还不是很清楚。相关:新日期的目标是什么?您是否只是尝试添加一个月或一年,并说明月份中不同的天数?您可能应该添加更多的示例开始日期和预期结果。此relativedelta库也将负责闰年?@Anonymous:是的,检查文档。将执行此操作并将批准:)对于此日期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号。请建议我如何实现此目标