fix: parse naive date/time strings in to_time's target timezone (#1359)

* fix: interpret naive time date strings in target timezone

* test: cover naive and offset time date strings
This commit is contained in:
Normann
2026-10-11 08:39:08 +02:00
committed by GitHub
parent 7d772abd54
commit 9cf20c6ef1
2 changed files with 42 additions and 6 deletions
+12 -6
View File
@@ -672,12 +672,15 @@ def to_time(
- pendulum.Time or pendulum.DateTime
- datetime.time or datetime.datetime
- strings like "14:30", "2:30 PM", "1430", "14:30:00.123", "2PM", "14h30"
- date/time strings (e.g. "2026-01-15T23:45")
- int (e.g. 14 → 14:00)
- float (e.g. 14.5 → 14:30)
- tuple like (14,), (14, 30), (14, 30, 15)
in_timezone: Optional timezone name or object (e.g., "Europe/Berlin").
Defaults to the local timezone.
Defaults to the local timezone. Date/time strings without an offset use this
timezone as their wall time; strings with `Z` or an offset represent an instant
that is converted to this timezone.
to_naive: If True, return a timezone-naive Time object.
@@ -812,16 +815,18 @@ def to_time(
# Fallback to pendulum's parser
try:
dt = cast(pendulum.DateTime, pendulum.parse(value, strict=False)).in_tz(timezone)
dt = cast(
pendulum.DateTime, pendulum.parse(value, tz=timezone, strict=False)
).in_tz(timezone)
return finalize(dt.time())
except Exception as e:
logger.trace(f"Pendulum parser failed for '{value}': {e}")
# Try parsing with ISO time prefix
try:
dt = cast(pendulum.DateTime, pendulum.parse(f"T{value}", strict=False)).in_tz(
timezone
)
dt = cast(
pendulum.DateTime, pendulum.parse(f"T{value}", tz=timezone, strict=False)
).in_tz(timezone)
return finalize(dt.time())
except Exception as e:
logger.trace(f"ISO time parser failed for 'T{value}': {e}")
@@ -829,7 +834,8 @@ def to_time(
# Try parsing as part of a full datetime
try:
dt = cast(
pendulum.DateTime, pendulum.parse(f"2000-01-01 {value}", strict=False)
pendulum.DateTime,
pendulum.parse(f"2000-01-01 {value}", tz=timezone, strict=False),
).in_tz(timezone)
return finalize(dt.time())
except Exception as e: