Merge pull request #137 from jepler/dst-enum

Use an enum for DST status
This commit is contained in:
Jeff Epler 2025-04-21 09:18:11 +02:00 committed by GitHub
commit 6b57582d3e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -323,6 +323,16 @@ _dst_ls_lut = [
]
@enum.unique
class DstStatus(enum.IntEnum):
"""Constants that describe the DST status of a minute"""
DST_NOT_IN_EFFECT = 0b00
DST_STARTS_TODAY = 0b01
DST_ENDS_TODAY = 0b10
DST_IN_EFFECT = 0b11
class _WWVBMinute(NamedTuple):
"""Uniquely identifies a minute of time in the WWVB system.
@ -341,7 +351,7 @@ class _WWVBMinute(NamedTuple):
min: int
"""Minute of hour"""
dst: int
dst: DstStatus
"""2-bit DST code """
ut1: int
@ -368,16 +378,13 @@ class WWVBMinute(_WWVBMinute):
days: int,
hour: int,
minute: int,
dst: int | None = None,
dst: DstStatus | int | None = None,
ut1: int | None = None,
ls: bool | None = None,
ly: bool | None = None,
) -> WWVBMinute:
"""Construct a WWVBMinute"""
if dst is None:
dst = cls.get_dst(year, days)
if dst not in (0, 1, 2, 3):
raise ValueError("dst value should be 0..3")
dst = cls.get_dst(year, days) if dst is None else DstStatus(dst)
if ut1 is None and ls is None:
ut1, ls = cls._get_dut1_info(year, days)
elif ut1 is None or ls is None:
@ -407,13 +414,13 @@ class WWVBMinute(_WWVBMinute):
return year
@staticmethod
def get_dst(year: int, days: int) -> int:
def get_dst(year: int, days: int) -> DstStatus:
"""Get the 2-bit WWVB DST value for the given day"""
d0 = datetime.datetime(year, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta(days - 1)
d1 = d0 + datetime.timedelta(1)
dst0 = isdst(d0)
dst1 = isdst(d1)
return dst1 * 2 + dst0
return DstStatus(dst1 * 2 + dst0)
def __str__(self) -> str:
"""Implement str()"""