Source code for hebrewcal.astro.timezone
"""Bridge between the integer RD day count and timezone-aware datetimes.
An astronomical instant is expressed as an RD value plus either a fraction of a
day or a number of minutes past 00:00 UTC. Minutes outside [0, 1440) are allowed
and roll into adjacent civil days, which is what high-latitude events need.
"""
from __future__ import annotations
import datetime
from zoneinfo import ZoneInfo
from hebrewcal.calendars.gregorian import GregorianDate
[docs]
def utc_datetime(
rd: int, day_fraction: float = 0.0, minutes: float | None = None
) -> datetime.datetime:
"""Return a UTC-aware datetime for an RD value.
Provide either ``day_fraction`` (0.0–1.0+) or ``minutes`` past 00:00 UTC;
``minutes`` takes precedence when given and may lie outside a single day.
"""
g = GregorianDate.from_rd(rd)
base = datetime.datetime(g.year, g.month, g.day, tzinfo=datetime.UTC)
if minutes is not None:
return base + datetime.timedelta(minutes=minutes)
return base + datetime.timedelta(days=day_fraction)
[docs]
def local_datetime(
rd: int,
day_fraction: float = 0.0,
minutes: float | None = None,
timezone: str = "UTC",
) -> datetime.datetime:
"""Return the same instant as :func:`utc_datetime`, in the given time zone."""
return utc_datetime(rd, day_fraction, minutes).astimezone(ZoneInfo(timezone))