from dateutil import parser, tz
from datetime import timedelta
# Known timezone mappings
TZINFOS = {
"EST": tz.gettz("America/New_York"),
"EDT": tz.gettz("America/New_York"),
"CST": tz.gettz("America/Chicago"),
"CDT": tz.gettz("America/Chicago"),
"PST": tz.gettz("America/Los_Angeles"),
"PDT": tz.gettz("America/Los_Angeles"),
}
def add_hours_to_date_string(date_str: str, hours: int):
"""
Parse a date string with timezone abbreviations and add N hours.
Returns a timezone-aware datetime.
"""
dt = parser.parse(date_str, tzinfos=TZINFOS)
return dt + timedelta(hours=hours)
def run_tests():
print("Running tests...\n")
# Test 1 — your original example
s1 = "May 21 2026 7:30 pm EST"
result1 = add_hours_to_date_string(s1, 12)
print("Test 1:", result1, "EXPECTED: 2026-05-22 07:30:00-04:00\n")
# Test 2 — morning time
s2 = "May 21 2026 8:00 am EST"
result2 = add_hours_to_date_string(s2, 5)
print("Test 2:", result2, "EXPECTED: 2026-05-21 13:00:00-04:00\n")
# Test 3 — crossing midnight
s3 = "May 21 2026 11:15 pm EST"
result3 = add_hours_to_date_string(s3, 10)
print("Test 3:", result3, "EXPECTED: 2026-05-22 09:15:00-04:00\n")
# Test 4 — different timezone
s4 = "May 21 2026 3:00 pm PST"
result4 = add_hours_to_date_string(s4, 4)
print("Test 4:", result4, "EXPECTED: 2026-05-21 22:00:00-07:00\n")
# Test 5 — large hour addition
s5 = "May 21 2026 1:00 pm EST"
result5 = add_hours_to_date_string(s5, 48)
print("Test 5:", result5, "EXPECTED: 2026-05-23 13:00:00-04:00\n")
# Run tests
run_tests()
'''
run:
Running tests...
Test 1: 2026-05-22 07:30:00-04:00 EXPECTED: 2026-05-22 07:30:00-04:00
Test 2: 2026-05-21 13:00:00-04:00 EXPECTED: 2026-05-21 13:00:00-04:00
Test 3: 2026-05-22 09:15:00-04:00 EXPECTED: 2026-05-22 09:15:00-04:00
Test 4: 2026-05-21 19:00:00-07:00 EXPECTED: 2026-05-21 22:00:00-07:00
Test 5: 2026-05-23 13:00:00-04:00 EXPECTED: 2026-05-23 13:00:00-04:00
'''