@@ -134,26 +134,48 @@ def parse_date(text_date: str) -> datetime:
134
134
return dt_utc
135
135
136
136
137
+ def convert_to_utc (dt : datetime , known_tz : str ) -> datetime :
138
+ """
139
+ Convert a datetime object to UTC timezone. If its
140
+ orignal timezone is not known, assume it is in US/Eastern.
141
+
142
+ Args:
143
+ dt (datetime): The datetime object to convert
144
+ known_tz (str): The timezone string if known
145
+
146
+ Returns:
147
+ datetime: The datetime object in UTC timezone
148
+ """
149
+ if not dt :
150
+ return None
151
+ if not known_tz :
152
+ # Assume it is in US/Eastern where MIT is
153
+ dt = dt .replace (tzinfo = ZoneInfo ("US/Eastern" ))
154
+ return dt .astimezone (UTC )
155
+
156
+
137
157
def parse_date_time_range (
138
- start_date_str , end_date_str , time_range_str : str
158
+ start_date_str : str , end_date_str : str , time_range_str : str
139
159
) -> tuple [datetime , datetime ]:
140
160
"""
141
161
Attempt to parse the time range from the MITPE events API.
142
162
The field might not actually contain a time or range.
143
163
144
164
Args:
165
+ start_date_str (str): start date string
166
+ end_date_str (str): end date string
145
167
time_range (str): time range string
146
168
147
169
Returns:
148
- tuple: start and end times as strings
170
+ tuple: start and end datetimes
149
171
150
172
"""
151
173
start_time , start_ampm , end_time , end_ampm , tz = "" , "" , "" , "" , ""
152
174
time_regex = re .compile (
153
175
r"(\d{1,2})(:\d{2})?\s*(am|pm)?\s*-?\s*(\d{1,2})(:?\d{2})?\s*(am|pm)?\s*([A-Za-z]{2,3})?" ,
154
176
re .IGNORECASE ,
155
177
)
156
- time_match = re .match (time_regex , time_range_str )
178
+ time_match = re .match (time_regex , time_range_str or "" )
157
179
if time_match :
158
180
start_time = f"{ time_match .group (1 )} { time_match .group (2 ) or ':00' } " or ""
159
181
start_ampm = time_match .group (3 ) or ""
@@ -165,10 +187,6 @@ def parse_date_time_range(
165
187
) or dateparser .parse (start_date_str )
166
188
else :
167
189
start_date = dateparser .parse (start_date_str )
168
- if start_date :
169
- if not tz :
170
- start_date = start_date .replace (tzinfo = ZoneInfo ("US/Eastern" ))
171
- start_date = start_date .astimezone (UTC )
172
190
if end_date_str :
173
191
end_date = dateparser .parse (
174
192
f"{ end_date_str } { end_time } { end_ampm or '' } { tz } "
@@ -177,10 +195,6 @@ def parse_date_time_range(
177
195
end_date = dateparser .parse (
178
196
f"{ start_date_str } { end_time } { end_ampm or "" } { tz } "
179
197
) or dateparser .parse (start_date_str )
180
- if end_date :
181
- if not tz :
182
- end_date = end_date .replace (tzinfo = ZoneInfo ("US/Eastern" ))
183
- end_date = end_date .astimezone (UTC )
184
198
if not start_date :
185
199
log .error ("Failed to parse start date %s" , start_date_str )
186
- return start_date , end_date
200
+ return convert_to_utc ( start_date , tz ), convert_to_utc ( end_date , tz )
0 commit comments