Files
weather-base-station/tools/julian.py
T

57 lines
1.6 KiB
Python

# 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)