4#include <janus/janus.hpp>
40template <
typename Scalar>
class Epoch {
49 Epoch() : m_tai_sec(Scalar(0.0)), m_delta_at(37) {}
104 int min = 0,
double sec = 0.0)
105 requires std::is_floating_point_v<Scalar>
119 Scalar gps_sec_since_epoch =
127 constexpr double GPS_EPOCH_TAI_SEC =
131 Scalar tai_sec = GPS_EPOCH_TAI_SEC + gps_sec_since_epoch;
180 [[nodiscard]]
const Scalar &
tai_seconds()
const {
return m_tai_sec; }
206 requires std::is_floating_point_v<Scalar>
210 return static_cast<int>(std::floor(days_since_gps_epoch / 7.0));
220 if constexpr (std::is_floating_point_v<Scalar>) {
222 std::floor(
static_cast<double>(days_since_gps_epoch) / 7.0);
223 double days_into_week = days_since_gps_epoch - weeks * 7.0;
227 Scalar days_into_week =
228 janus::fmod(days_since_gps_epoch, Scalar(7.0));
240 [[nodiscard]]
int delta_at()
const {
return m_delta_at; }
255 return Epoch(m_tai_sec + seconds, m_delta_at);
262 return Epoch(m_tai_sec - seconds, m_delta_at);
269 return m_tai_sec - other.m_tai_sec;
276 m_tai_sec = m_tai_sec + seconds;
284 m_tai_sec = m_tai_sec - seconds;
296 requires std::is_floating_point_v<Scalar>
301 std::ostringstream oss;
302 oss << std::setfill(
'0') << std::setw(4) << year <<
'-' << std::setw(2)
303 << month <<
'-' << std::setw(2) << day <<
'T' << std::setw(2)
304 << hour <<
':' << std::setw(2) << min <<
':' << std::setw(2)
305 <<
static_cast<int>(sec);
308 double frac = sec - std::floor(sec);
310 oss <<
'.' << std::setw(3) <<
static_cast<int>(frac * 1000);
320 [[nodiscard]] std::tuple<int, int, int, int, int, double>
322 requires std::is_floating_point_v<Scalar>
static Epoch from_gps_week(int week, const Scalar &seconds_of_week, int delta_at=37)
Create Epoch from GPS week and seconds.
Definition Epoch.hpp:117
Epoch()
Default constructor (J2000.0 epoch).
Definition Epoch.hpp:49
Epoch operator-(const Scalar &seconds) const
Subtract duration in seconds.
Definition Epoch.hpp:261
static Epoch from_jd_tai(const Scalar &jd_tai, int delta_at=37)
Create Epoch from TAI Julian Date.
Definition Epoch.hpp:75
double jd_tai() const
Definition Epoch.hpp:142
std::string to_iso_string() const
Convert to ISO 8601 string in UTC.
Definition Epoch.hpp:295
const double & tai_seconds() const
Definition Epoch.hpp:180
Scalar operator-(const Epoch &other) const
Time difference in seconds.
Definition Epoch.hpp:268
Scalar tt_seconds() const
Get TT seconds since J2000.0.
Definition Epoch.hpp:185
Epoch & operator-=(const Scalar &seconds)
Subtract duration in seconds (in-place).
Definition Epoch.hpp:283
Scalar mjd_tt() const
Get Modified Julian Date in TT scale.
Definition Epoch.hpp:171
double jd_tt() const
Definition Epoch.hpp:149
Scalar jd_tdb() const
Get Julian Date in TDB scale.
Definition Epoch.hpp:166
Scalar jd_utc() const
Get Julian Date in UTC scale (using stored delta_at).
Definition Epoch.hpp:159
double jd_gps() const
Definition Epoch.hpp:154
Epoch & operator+=(const Scalar &seconds)
Add duration in seconds (in-place).
Definition Epoch.hpp:275
Scalar gps_seconds_of_week() const
Get seconds within the GPS week.
Definition Epoch.hpp:216
void set_delta_at(int delta_at)
Set the TAI - UTC offset.
Definition Epoch.hpp:245
std::tuple< int, int, int, int, int, double > to_utc_calendar() const
Convert to calendar components in UTC.
Definition Epoch.hpp:321
int gps_week() const
Get GPS week number.
Definition Epoch.hpp:205
Scalar centuries_tt() const
Get Julian centuries since J2000.0 in TT scale.
Definition Epoch.hpp:194
Epoch operator+(const Scalar &seconds) const
Add duration in seconds.
Definition Epoch.hpp:254
static Epoch from_jd_gps(const Scalar &jd_gps, int delta_at=37)
Create Epoch from GPS Julian Date.
Definition Epoch.hpp:91
int delta_at() const
Definition Epoch.hpp:240
static Epoch from_jd_tt(const Scalar &jd_tt, int delta_at=37)
Create Epoch from TT Julian Date.
Definition Epoch.hpp:83
static Epoch from_utc(int year, int month, int day, int hour=0, int min=0, double sec=0.0)
Create Epoch from UTC calendar (numeric only).
Definition Epoch.hpp:103
static Epoch from_tai_seconds(const Scalar &tai_sec, int delta_at=37)
Create Epoch from TAI seconds since J2000.0.
Definition Epoch.hpp:68
Epoch(const Scalar &tai_seconds, int delta_at=37)
Construct from TAI seconds since J2000.0.
Definition Epoch.hpp:58
constexpr double JD_GPS_EPOCH
Julian Date of GPS epoch (1980-01-06 00:00:00 UTC).
Definition TimeConstants.hpp:19
constexpr double SECONDS_PER_WEEK
Seconds per week (for GPS).
Definition TimeConstants.hpp:57
constexpr double SECONDS_PER_DAY
Seconds per day.
Definition TimeConstants.hpp:45
constexpr double SECONDS_PER_CENTURY
Seconds per Julian century.
Definition TimeConstants.hpp:48
constexpr double JD_J2000
Julian Date of J2000.0 epoch (2000-01-01 12:00:00 TT).
Definition TimeConstants.hpp:10
constexpr double TT_TAI_OFFSET
TT - TAI offset [s] (exact, by definition).
Definition TimeConstants.hpp:32
constexpr double TAI_GPS_OFFSET
TAI - GPS offset [s].
Definition TimeConstants.hpp:38
constexpr Scalar gps_to_tai(const Scalar &gps_jd)
Convert GPS Julian Date to TAI Julian Date.
Definition TimeScales.hpp:69
int leap_seconds_at_utc(double utc_jd)
Get TAI - UTC offset for a given UTC Julian Date.
Definition LeapSeconds.hpp:93
constexpr Scalar utc_to_tai(const Scalar &utc_jd, int delta_at)
Convert UTC Julian Date to TAI Julian Date (templated).
Definition TimeScales.hpp:89
Epoch< double > NumericEpoch
Numeric epoch (double-precision).
Definition Epoch.hpp:338
std::tuple< int, int, int, int, int, double > jd_to_calendar(double jd)
Convert Julian Date to calendar date/time (numeric only).
Definition JulianDate.hpp:46
constexpr Scalar tt_to_tai(const Scalar &tt_jd)
Convert TT Julian Date to TAI Julian Date.
Definition TimeScales.hpp:45
constexpr Scalar j2000_seconds_to_jd(const Scalar &sec)
Convert seconds since J2000.0 to Julian Date.
Definition JulianDate.hpp:132
constexpr Scalar tai_to_utc(const Scalar &tai_jd, int delta_at)
Convert TAI Julian Date to UTC Julian Date (templated).
Definition TimeScales.hpp:103
Scalar tt_to_tdb(const Scalar &tt_jd)
Convert TT Julian Date to TDB Julian Date.
Definition TimeScales.hpp:188
constexpr Scalar jd_to_j2000_seconds(const Scalar &jd)
Convert Julian Date to seconds since J2000.0.
Definition JulianDate.hpp:124
constexpr Scalar jd_to_mjd(const Scalar &jd)
Convert Julian Date to Modified Julian Date.
Definition JulianDate.hpp:103
constexpr Scalar tai_to_tt(const Scalar &tai_jd)
Convert TAI Julian Date to TT Julian Date.
Definition TimeScales.hpp:36
Epoch< janus::SymbolicScalar > SymbolicEpoch
Symbolic epoch (CasADi MX).
Definition Epoch.hpp:341
double calendar_to_jd(int year, int month, int day, int hour=0, int min=0, double sec=0.0)
Convert calendar date/time to Julian Date.
Definition JulianDate.hpp:24
constexpr Scalar tai_to_gps(const Scalar &tai_jd)
Convert TAI Julian Date to GPS Julian Date.
Definition TimeScales.hpp:60