🛠️ToolsShed

Generator Tanggal Berulang

Menghasilkan tanggal acara berulang: harian, mingguan, bulanan, atau interval kustom.

Pertanyaan yang Sering Diajukan

Implementasi Kode

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.