gpt4 book ai didi

python - 分析日期并每月打印下一个日期

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:32 25 4
gpt4 key购买 nike

对于我目前正在开发的程序的功能,我需要能够分析日期,然后每月返回所有即将到来的日期。

例如插入:13/04/2018 --> 这是 4 月第二周的一个星期五。返回:接下来几个月的所有第二个星期五(11/05/2018、8/06/2018、13/07/2018,...)

另一个限制是,如果其中一个即将到来的月份的第一天是星期六或星期日,则这不算作第一周。第一周是从第一周开始算的,日期比周末多。示例:4 月 1 日是星期日,因此 4 月的第一周从 2 日到 8 日开始。或者 6 月 1 日是星期五,因此 6 月的第一周是从 5 月 28 日到 6 月 3 日。

我试过做一些事情,但它似乎没有返回正确的日期。

startdate = input("Enter a startdate: ")
startdate = datetime.strptime(startdate, "%Y-%m-%d").date()
dayOfTheWeek = startdate.weekday()
first_day = startdate.replace(day=1)
cal = calendar.Calendar()
weeks = cal.monthdayscalendar(startdate.year, startdate.month)
if(first_day.isoweekday() in (6,7)): adjustRange = 1
else: adjustRange = 0
for x in range(len(weeks)):
if startdate.day in weeks[x]:
weekNumb = x-adjustRange

for x in range(0, 5):
tempWeek = weekNumb
print("Date: ", startdate)
if(startdate.month + 1 > 12): added_months = 1
else: added_months = startdate.month + 1
weeks = cal.monthdayscalendar(startdate.year, added_months)

first_day = startdate.replace(day=1)
if(first_day.isoweekday() in (6,7)): tempWeek += 1

plannedDay = weeks[tempWeek][dayOfTheWeek]

if(added_months < 10): added_months = str(added_months).zfill(2)
datestr = "{}-{}-{}".format(startdate.year, added_months, plannedDay)
startdate = datetime.strptime(datestr, "%Y-%m-%d").date()

输出:

Enter a startdate: 2018-04-13
Date: 2018-04-13
Date: 2018-05-18 --> must be 2018-05-11
Date: 2018-06-08 --> OK
Date: 2018-07-06 --> must be 2018-07-13
Date: 2018-08-17 --> must be 2018-08-10

看起来他们都停了一个星期,不是多了就是少了。

基本上,我得到星期几 (0-6),然后询问当月的第一天。然后,我使用日历模块询问该月的所有周数及其日期,并检查插入日期所在的周数。如果一个月的第一天是星期六或星期日(使用 .isoweekday() 为 6 或 7),那么我们必须从周数中减去一个以获得实际的周数。

然后,我分析所有进一步的日期,如果它们的 first_day 也落在星期六或星期日,我必须将一个添加到 tempWeek(其中包含原始 weekNumb),因为我试图从周元组中提取日期我从日历中收到。

我希望这种方式有意义并且我的代码具有一定的可读性。

最佳答案

如果你pip install python-dateutil

from dateutil.rrule import rrule, MONTHLY, weekdays
from dateutil.parser import parse
import math

def month_week(date):
return math.ceil((date - date.replace(day=1)).days / 7 ) or 1

start_date = parse(input("Enter a startdate: "))
for day in rrule(freq=MONTHLY,
count=5,
dtstart=start_date,
byweekday=weekdays[start_date.weekday()](
month_week(start_date)),
):
print("Date: ", day.date())

将按照您对 2018-04-13 的预期进行。

根据您的问题,我不确定 2018-09-01(9 月的第一个星期六)或 2018-01-29(1 月的第 5 个星期五)的预期输出是什么。因此,您可能希望更改 month_week 函数以返回您期望的月份的周数。

关于python - 分析日期并每月打印下一个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49754741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com