use astrodynamics::time::model::TimeScale;
use astrodynamics::time::scales::{find_leap_seconds, TimeScales};
const TT_MINUS_TAI_S: f64 = 32.184;
const GPST_MINUS_TAI_S: f64 = 19.0;
const BDT_MINUS_TAI_S: f64 = 33.0;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CalendarEpoch {
pub year: i32,
pub month: i32,
pub day: i32,
pub hour: i32,
pub minute: i32,
pub second: f64,
}
impl CalendarEpoch {
pub const fn new(year: i32, month: i32, day: i32, hour: i32, minute: i32, second: f64) -> Self {
Self {
year,
month,
day,
hour,
minute,
second,
}
}
pub(crate) fn time_scales(self, scale: TimeScale) -> TimeScales {
let offset = scale_minus_utc_seconds(self, scale);
TimeScales::from_utc(
self.year,
self.month,
self.day,
self.hour,
self.minute,
self.second - offset,
)
}
}
fn scale_minus_utc_seconds(cal: CalendarEpoch, scale: TimeScale) -> f64 {
if matches!(scale, TimeScale::Utc) {
return 0.0;
}
let probe = TimeScales::from_utc(
cal.year, cal.month, cal.day, cal.hour, cal.minute, cal.second,
);
let leap = find_leap_seconds(probe.jd_tt);
match scale {
TimeScale::Utc => 0.0,
TimeScale::Tai => leap,
TimeScale::Tt | TimeScale::Tdb => leap + TT_MINUS_TAI_S,
TimeScale::Gpst | TimeScale::Gst => leap - GPST_MINUS_TAI_S,
TimeScale::Bdt => leap - BDT_MINUS_TAI_S,
}
}
pub(crate) fn dt_seconds(t0: &TimeScales, t: &TimeScales) -> f64 {
let dwhole = t.jd_whole - t0.jd_whole;
let dfrac = t.tt_fraction - t0.tt_fraction;
(dwhole + dfrac) * 86400.0
}