@@ -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+
3743def 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
4449def 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