跳到内容
🛠️ToolsShed

重复日期生成器

生成每日、每周、每月或自定义间隔的重复事件日期。

关于此工具

循环日期生成器可帮助您计算并显示重复事件的日期,无需手动计算。无论您是计划每周的团队会议、每月的账单支付还是每日提醒,该工具都会根据您的开始日期和重复模式立即生成所有需要的日期。

使用该工具,请选择开始日期,选择重复类型(每日、每周、每月或每年),并设置要生成的发生次数。该工具会立即显示所有未来事件日期的完整列表,您可以复制、导出或按需参考。您也可以指定自定义间隔,例如每3周或每6个月。

这个工具对项目经理、活动策划者和任何需要安排重复任务的人都很有用。它消除了手动日期计算的错误,并在协调跨多个日期的会议、订阅或维护计划时节省时间。

常见问题

代码实现

from datetime import date, timedelta
from dateutil.relativedelta import relativedelta  # pip install python-dateutil

def generate_recurring_dates(
    start: str,
    pattern: str,
    count: int,
    days_of_week: list[int] = None,  # 0=Mon..6=Sun, for weekly multi-day
) -> list[str]:
    """
    pattern: 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'yearly'
    """
    start_date = date.fromisoformat(start)
    results = []

    if pattern == "weekly" and days_of_week:
        # Multi-day-of-week weekly
        d = start_date - timedelta(days=start_date.weekday())  # Go to Monday of week
        while len(results) < count:
            for dow in sorted(days_of_week):
                if len(results) >= count:
                    break
                candidate = d + timedelta(days=dow)
                if candidate >= start_date:
                    results.append(candidate.isoformat())
            d += timedelta(weeks=1)
        return results

    current = start_date
    for _ in range(count):
        results.append(current.isoformat())
        if pattern == "daily":
            current += timedelta(days=1)
        elif pattern == "weekly":
            current += timedelta(weeks=1)
        elif pattern == "biweekly":
            current += timedelta(weeks=2)
        elif pattern == "monthly":
            current += relativedelta(months=1)
        elif pattern == "yearly":
            current += relativedelta(years=1)
    return results

# Examples
print(generate_recurring_dates("2025-01-06", "weekly", 5))
print(generate_recurring_dates("2025-01-01", "monthly", 6))
print(generate_recurring_dates("2025-01-06", "weekly", 8, days_of_week=[0, 2]))  # Mon+Wed

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.