我的日期应始终位于输入日期的8号或22号。
例如:
如果输入日期为 20190415 ,则输出日期应为 20190422 ,因为这是最近的日期,如果输入日期为 20190424 ,则输出日期应为 20190508 。
示例1:
input_date = 20190415
预期的output_date = 20190422
示例2
input_date = 20190424
预期的output_date = 20190508
示例3 :
input_date = 20190506
预期的output_date = 20190508
示例4:
input_date = 20191223
预期的output_date = 20200108
我们如何使用Python实现这一目标?
答案 0 :(得分:1)
您可以检查日期是否大于22,如果是,则将其设置为下个月的8号。如果介于8到22之间,则将其设置为当月的22,如果低于8,则将其设置为该月的8。使用日期数学可能有更优雅的方法,但这将适合您的情况。
使用datetime
模块找出“下个月”是什么。一种方法是将timedelta
对象添加到当月的第一个月,然后将该datetime
对象上的日期更改为第八。这是一个简短的示例,看起来像这样:
from datetime import date, timedelta
input_date = date(2019, 12, 23)
if input_date.day > 22:
output_date = date(input_date.year, input_date.month) + timedelta(days=31)
output_date = output_date.replace(day = 8)
您可以阅读有关datetime
模块在the official documentation上如何工作的详细信息。读了很长时间,但实际上我将该页面加了书签,因为我总是必须回头参考如何实际使用该模块:)
答案 1 :(得分:0)
将输入视为字符串,可以使用timedelta计算下一个日期,请查看以下代码:
if 8<datetime.strptime(input_date, "%Y%m%d").day < 22:
delta = 22 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
elif datetime.strptime(str(input_date), "%Y%m%d").day < 8:
delta = 8 - datetime.strptime(input_date, "%Y%m%d").day
print((datetime.strptime(input_date, "%Y%m%d") +
timedelta(days=delta)).strftime("%Y%m%d"))
else:
delta = (datetime.strptime(input_date, "%Y%m%d")+ relativedelta(months=+1)).day -8
print((datetime.strptime(input_date, "%Y%m%d") + relativedelta(months=+1) -
timedelta(days=delta)).strftime("%Y%m%d") )