Skip to content

Commit 80e9bb3

Browse files
committed
All date conversions allow explicit UTC offset.
1 parent b7a6cfe commit 80e9bb3

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

immanuel/tools/date.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,16 @@ def timezone_name(lat: float, lon: float) -> str:
3434
return TimezoneFinder().timezone_at(lat=lat, lng=lon)
3535

3636

37+
def get_timezone(lat: float, lon: float, offset: float) -> ZoneInfo | timezone:
38+
""" Returns a timezone object based on either decimal lat/lon
39+
coordinates or an explicit UTC offset. """
40+
return ZoneInfo(timezone_name(lat, lon)) if offset is None else timezone(timedelta(hours=offset))
41+
42+
3743
def localize(dt: datetime, lat: float, lon: float, offset: float = None, is_dst: bool = None) -> datetime:
3844
""" Localizes a naive datetime based on either decimal lat/lon
3945
coordinates or an explicit UTC offset. """
40-
zone = ZoneInfo(timezone_name(lat, lon)) if offset is None else timezone(timedelta(hours=offset))
41-
return dt.replace(tzinfo=zone, fold=1 if is_dst is False else 0)
46+
return dt.replace(tzinfo=get_timezone(lat, lon, offset), fold=1 if is_dst is False else 0)
4247

4348

4449
def to_datetime(dt: str | float | datetime, lat: float = None, lon: float = None, offset: float = None, is_dst: bool = None) -> datetime:
@@ -47,12 +52,12 @@ def to_datetime(dt: str | float | datetime, lat: float = None, lon: float = None
4752
no_coords = lat is None or lon is None
4853
if isinstance(dt, str):
4954
date_time = datetime.fromisoformat(dt)
50-
return date_time.replace(tzinfo=ZoneInfo('UTC')) if no_coords else localize(date_time, lat, lon, offset, is_dst)
55+
return date_time.replace(tzinfo=ZoneInfo('UTC')) if no_coords and offset is None else localize(date_time, lat, lon, offset, is_dst)
5156
if isinstance(dt, float):
5257
ut = swe.revjul(dt)
5358
time = convert.dec_to_dms(ut[3])[1:]
5459
date_time = datetime(*ut[:3], *time, tzinfo=ZoneInfo('UTC'))
55-
return date_time if no_coords else date_time.astimezone(ZoneInfo(timezone_name(lat, lon)))
60+
return date_time if no_coords else date_time.astimezone(get_timezone(lat, lon, offset))
5661
if isinstance(dt, datetime):
5762
if no_coords:
5863
return dt.replace(tzinfo=ZoneInfo('UTC')) if dt.tzinfo is None else dt

0 commit comments

Comments
 (0)