# tools/julian.py from datetime import datetime, timedelta import math def julian_date(date: datetime | None = None) -> float: """Given any date in the future or past, return julian date""" if date is None: date = datetime.now() time_ms = date.timestamp() * 1000 return (time_ms / 86400000) + 2440587.5 def CJDN(date: datetime | None = None) -> int: return round(julian_date(date)) def current_julian_date() -> float: """Returns current julian date""" return julian_date() def tomorrow_julian_date() -> float: """returns tomorrow's julian date""" date = datetime.now() + timedelta(days=1) return julian_date(date) def future_julian_date( hoursadd: int = 0, minutesadd: int = 0, secondsadd: int = 0 ) -> float: """defaults to current if no specifications made. HOURS, MINUTES, AND SECONDS CANNOT BE NEGATIVE""" date = datetime.now() + timedelta( hours=hoursadd, minutes=minutesadd, seconds=secondsadd ) return julian_date(date) def epoch_days(date: datetime | None = None) -> float: """returns days since Jan 1st, 2000. Negative if before this date""" return julian_date(date) - 2451545.0 def day_percent(date: datetime | None = None) -> float: """Returns decimal portion of Julian Date""" whole = julian_date(date) return whole - math.floor(whole) def from_julian(j: float) -> datetime: """Returns datetime.datetime object given julian date J""" J1970 = 2440588.0 dayMs = 24 * 60 * 60 * 1000 return datetime.fromtimestamp((j + 0.5 - J1970) * dayMs / 1000.0)