from datetime import datetime
import math
import uuid_utils
from uuid_utils import uuid7
from uuid import UUID
[docs]
def convert_epoch(epoch_in_s: float) -> tuple[int, int]:
"""Convert epoch to seconds and nanoseconds.
Should be fine until year=6429
"""
fractional_part, seconds = math.modf(epoch_in_s)
nanos = round(fractional_part * 1_000_000_000)
return int(seconds), nanos
[docs]
def create_uuidv7_from_epoch(epoch_in_s: float) -> UUID:
uuid = UUID(bytes=uuid7(*convert_epoch(epoch_in_s)).bytes)
return uuid
[docs]
def create_uuidv7_from_datetime(dt: datetime) -> UUID:
uuid = uuid7(int(dt.timestamp()), dt.microsecond * 1_000)
return UUID(bytes=uuid.bytes)
[docs]
def zero_non_timestamp_fields(uuid: UUID) -> UUID:
"""Zero out the non-timestamp fields of a UUIDv7."""
return UUID(fields=(uuid.time_low, uuid.time_mid, 0x7000, 0x80, 0, 0))
[docs]
def read_datetime_from_uuidv7(uuid: UUID) -> datetime:
uuid_copy = uuid_utils.UUID(bytes=uuid.bytes)
return datetime.fromtimestamp(uuid_copy.timestamp / 1000.0)