use crate::{ATTOS_PER_SEC_I128, ATTOS_PER_WEEK, Dt, Real, SEC_PER_DAYI64, Scale};
impl Dt {
pub const fn to_gps_wk_and_tow(&self, current: Scale) -> (i64, Dt) {
let total_attos = self.to_gps(current).to_attos();
let wk = total_attos.div_euclid(ATTOS_PER_WEEK) as i64;
let tow_attos = total_attos.rem_euclid(ATTOS_PER_WEEK);
(wk, Dt::from_attos(tow_attos, Scale::TAI))
}
pub const fn to_gps_day_of_wk(&self, current: Scale) -> u8 {
let (_, tow) = self.to_gps_wk_and_tow(current);
let secs = tow.to_attos() / ATTOS_PER_SEC_I128;
(secs / SEC_PER_DAYI64 as i128) as u8
}
#[inline]
pub const fn to_gps_tow_f(&self, current: Scale) -> Real {
let (_, tow) = self.to_gps_wk_and_tow(current);
tow.to_sec_f()
}
#[inline]
pub const fn to_gps_wk(&self, current: Scale) -> i64 {
self.to_gps_wk_and_tow(current).0
}
#[inline]
pub const fn to_galexsec(&self, current: Scale) -> Dt {
self.to(current, Scale::UTC)
.to_diff_raw(Dt::GPS_EPOCH.to(Scale::TAI, Scale::UTC))
}
#[inline]
pub const fn to_gps(&self, current: Scale) -> Dt {
self.to(current, Scale::GPS)
.to_diff_raw(Dt::GPS_EPOCH.to(Scale::TAI, Scale::GPS))
}
#[inline]
pub const fn to_cxcsec(&self, current: Scale) -> Dt {
self.to(current, Scale::TT)
.to_diff_raw(Dt::CXC_EPOCH.to(Scale::TAI, Scale::TT))
}
}