from datetime import date, timedelta
from typing import List
def get_dates_between(start_date_str: str, end_date_str: str) -> List[str]:
"""
Generates all dates between start_date and end_date inclusive.
Uses Python's built-in datetime module for robust calendar-aware date math.
Args:
start_date_str: Start date in "YYYY-MM-DD" format.
end_date_str: End date in "YYYY-MM-DD" format.
Returns:
A list of date strings in "YYYY-MM-DD" format.
"""
try:
# 1. Parse input strings into type-safe date objects using ISO 8601 parsing.
# This automatically validates calendar correctness (e.g., rejects Feb 31).
start_date = date.fromisoformat(start_date_str)
end_date = date.fromisoformat(end_date_str)
except ValueError as e:
raise ValueError(f"Invalid date format or illegal calendar date. Use YYYY-MM-DD. Details: {e}")
# 2. Validate that the date range is logically sound
if start_date > end_date:
raise ValueError("Start date cannot be after the end date.")
dates = []
current_date = start_date
# 3. Iterate day-by-day safely using timedelta
# timedelta(days=1) correctly handles month changes, leap years, and year rollovers.
while current_date <= end_date:
dates.append(current_date.isoformat())
current_date += timedelta(days=1)
return dates
# --- Example Usage ---
if __name__ == "__main__":
start = "2026-02-26"
end = "2026-03-02"
try:
date_list = get_dates_between(start, end)
print(f"Dates between {start} and {end}:")
for d in date_list:
print(d)
except ValueError as err:
print(f"Error: {err}")
'''
run:
Dates between 2026-02-26 and 2026-03-02:
2026-02-26
2026-02-27
2026-02-28
2026-03-01
2026-03-02
'''