Skip to content

Instantly share code, notes, and snippets.

@yeiichi
Last active July 2, 2025 00:49
Show Gist options
  • Save yeiichi/e928545d2f17677fa53edbee16fde0f3 to your computer and use it in GitHub Desktop.
Save yeiichi/e928545d2f17677fa53edbee16fde0f3 to your computer and use it in GitHub Desktop.
Generate a list of ISO week date ranges (Monday to Sunday) for a given year
#!/usr/bin/env python3
import argparse
from collections import namedtuple
from datetime import date
Week = namedtuple("Week", ["week_number", "start_date", "end_date"])
def list_iso_week_dates(year):
"""
Generate a list of ISO week date ranges (Monday to Sunday) for a given year.
"""
max_week_number = date(year, 12, 28).isocalendar().week
return [
Week(
week_number=week_number,
start_date=date.fromisocalendar(year, week_number, 1), # Mon
end_date=date.fromisocalendar(year, week_number, 7) # Sun
)
for week_number in range(1, max_week_number + 1)
]
def parse_arguments():
"""
Parse and return command-line arguments.
"""
parser = argparse.ArgumentParser()
parser.add_argument("year", type=int, help="Target year (yyyy)")
return parser.parse_args()
def format_week(week):
"""
Format a single week's details for display.
"""
return f'Week {week.week_number:2}: {week.start_date}–{week.end_date}'
def print_weeks(year):
"""
Print all ISO week date ranges for the input year.
"""
print(f'\n\033[93mISO Weeks in {year} (Monday–Sunday):\033[0m')
weeks = list_iso_week_dates(year)
for week in weeks:
print(format_week(week))
if __name__ == "__main__":
args = parse_arguments()
print_weeks(args.year)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment