Skip to main content

tempoch_core/
lib.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Vallés Puig, Ramon
3
4//! Time Module
5//!
6//! This module provides time-related types and abstractions for astronomical calculations.
7//!
8//! # Core types
9//!
10//! - [`Time<S>`] — generic instant parameterised by a [`TimeScale`] marker.
11//! - [`TimeScale`] — trait that defines a time scale (epoch offset + conversions).
12//! - [`JulianDate`] — type alias for `Time<JD>`.
13//! - [`JulianEphemerisDay`] — type alias for `Time<JDE>`.
14//! - [`ModifiedJulianDate`] — type alias for `Time<MJD>`.
15//! - [`Period<S>`] — a time interval parameterised by a [`TimeScale`] marker.
16//! - [`Interval<T>`] — a generic interval over any [`TimeInstant`].
17//! - [`TimeInstant`] — trait for points in time usable with [`Interval`].
18//!
19//! # Time scales
20//!
21//! The following markers implement [`TimeScale`]:
22//!
23//! | Marker | Scale |
24//! |--------|-------|
25//! | [`JD`] | Julian Date |
26//! | [`JDE`] | Julian Ephemeris Day |
27//! | [`MJD`] | Modified Julian Date |
28//! | [`TDB`] | Barycentric Dynamical Time |
29//! | [`TT`] | Terrestrial Time |
30//! | [`TAI`] | International Atomic Time |
31//! | [`TCG`] | Geocentric Coordinate Time |
32//! | [`TCB`] | Barycentric Coordinate Time |
33//! | [`GPS`] | GPS Time |
34//! | [`UnixTime`] | Unix / POSIX time |
35//! | [`UT`] | Universal Time (Earth rotation) |
36//!
37//! # ΔT (Delta T)
38//!
39//! The difference **ΔT = TT − UT** is applied automatically by the
40//! [`UT`] time scale.  Use `Time::<UT>::new(jd_ut)` for UT-based values,
41//! or construct any scale via `from_utc()` which routes through `UT` internally.
42//! The raw ΔT value (in seconds) is available via [`Time::<UT>::delta_t()`](Time::delta_t).
43
44mod delta_t;
45pub(crate) mod instant;
46mod julian_date_ext;
47mod period;
48mod scales;
49
50// ── Re-exports ────────────────────────────────────────────────────────────
51
52pub use instant::{NonFiniteTimeError, Time, TimeInstant, TimeScale};
53pub use period::{
54    complement_within, intersect_periods, normalize_periods, validate_period_list, ConversionError,
55    Interval, InvalidIntervalError, Period, PeriodListError, UtcPeriod,
56};
57pub use scales::{tai_minus_utc, UnixTime, GPS, JD, JDE, MJD, TAI, TCB, TCG, TDB, TT, UT};
58
59// ── Backward-compatible type aliases ──────────────────────────────────────
60
61/// Julian Date — continuous count of days since the Julian Period.
62///
63/// This is a type alias for [`Time<JD>`].  All historical call-sites
64/// (`JulianDate::new(...)`, `JulianDate::J2000`, `.julian_centuries()`, …)
65/// continue to work without modification.
66pub type JulianDate = Time<JD>;
67
68/// Julian Ephemeris Day — dynamical Julian day used by many ephemeris formulas.
69///
70/// This is a type alias for [`Time<JDE>`].
71pub type JulianEphemerisDay = Time<JDE>;
72
73/// Modified Julian Date — `JD − 2 400 000.5`.
74///
75/// This is a type alias for [`Time<MJD>`].
76pub type ModifiedJulianDate = Time<MJD>;
77
78/// Universal Time — Earth-rotation civil time scale.
79///
80/// This is a type alias for [`Time<UT>`].
81pub type UniversalTime = Time<UT>;