1313
1414import mimetypes
1515import re
16- from datetime import datetime , time
16+ from datetime import datetime , time , timezone
1717from pathlib import Path
1818from typing import List , Optional , Annotated , Dict
1919
@@ -53,22 +53,28 @@ def parse_timeframe(timeframe: str) -> datetime:
5353 timeframe: Natural language timeframe like 'today', '1d', '1 week ago', etc.
5454
5555 Returns:
56- datetime: The parsed datetime for the start of the timeframe
56+ datetime: The parsed datetime for the start of the timeframe, timezone-aware in local system timezone
5757
5858 Examples:
59- parse_timeframe('today') -> 2025-06-05 00:00:00 (start of today)
60- parse_timeframe('1d') -> 2025-06-04 14:50:00 (24 hours ago)
61- parse_timeframe('1 week ago') -> 2025-05-29 14:50:00 (1 week ago)
59+ parse_timeframe('today') -> 2025-06-05 00:00:00-07:00 (start of today with local timezone )
60+ parse_timeframe('1d') -> 2025-06-04 14:50:00-07:00 (24 hours ago with local timezone )
61+ parse_timeframe('1 week ago') -> 2025-05-29 14:50:00-07:00 (1 week ago with local timezone )
6262 """
6363 if timeframe .lower () == "today" :
64- # Return start of today (00:00:00)
65- return datetime .combine (datetime .now ().date (), time .min )
64+ # Return start of today (00:00:00) in local timezone
65+ naive_dt = datetime .combine (datetime .now ().date (), time .min )
66+ return naive_dt .astimezone ()
6667 else :
6768 # Use dateparser for other formats
6869 parsed = parse (timeframe )
6970 if not parsed :
7071 raise ValueError (f"Could not parse timeframe: { timeframe } " )
71- return parsed
72+
73+ # If the parsed datetime is naive, make it timezone-aware in local system timezone
74+ if parsed .tzinfo is None :
75+ return parsed .astimezone ()
76+ else :
77+ return parsed
7278
7379
7480def validate_timeframe (timeframe : str ) -> str :
@@ -85,7 +91,7 @@ def validate_timeframe(timeframe: str) -> str:
8591 parsed = parse_timeframe (timeframe )
8692
8793 # Convert to duration
88- now = datetime .now ()
94+ now = datetime .now (). astimezone ()
8995 if parsed > now :
9096 raise ValueError ("Timeframe cannot be in the future" )
9197
0 commit comments