Skip to content
🛠️ToolsShed

Recurring Date Generator

Generate recurring event dates: daily, weekly, monthly, or custom intervals.

About this tool

A Recurring Date Generator helps you calculate and display dates for repeating events without manual math. Whether you're planning weekly team meetings, monthly bill payments, or daily reminders, this tool instantly generates all the dates you need based on your start date and recurrence pattern.

To use the tool, select your start date, choose a recurrence type (daily, weekly, monthly, or yearly), and set how many occurrences you want to generate. The tool will immediately show you a complete list of all future event dates, which you can copy, export, or reference as needed. You can also specify custom intervals—for example, every 3 weeks or every 6 months.

This tool is invaluable for project managers, event planners, and anyone scheduling recurring tasks. It eliminates errors from manual date calculations and saves time when coordinating meetings, subscriptions, or maintenance schedules across multiple dates.

Frequently Asked Questions

Code Implementation

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.