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

标签 python python-3.x date datetime

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

例如 插入: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/

相关文章:

python - 将python与flutter集成

python - 如何用 2 位数年份解析字符串日期?

java - 如何使用 Java SimpleDateFormat 正确格式化异常日期字符串?

javascript - 不同浏览器上的不同行为

python - 使用纪元时间格式的给定时间之间的随机时间

Python - 返回嵌套列表中的字符串子串

python - 从选定位置导入 Python 模块

python - 将列表元素与字典的值进行匹配

python-3.x - Flask属性错误: module object has no attribute 'app'

python - 在 SQLite 数据库中输入大量条目