pub struct Dt {
pub sec: i64,
pub attos: u64,
}Expand description
§Dt A high-precision instant or duration with attosecond resolution.
This is the core time type of the library. It represents both absolute instants and durations using the same compact representation, making it convenient anywhere precise time measurement or arithmetic is needed.
§Representation
It stores:
sec: i64— whole seconds (signed).attos: u64— fractional seconds in attoseconds (0 ≤ attos < 10¹⁸).- These always push the
Dttowards the positive.
- These always push the
This gives a resolution of one attosecond while supporting a range of
roughly ±292 billion years. An i128 was considered but decided against
due to the difficulty of math without overflow.
There are many different ways to go to and from a Dt see the documentation
for the full list of methods.
It implements Copy and Clone. Optional derives for serde and
tsify are available behind the corresponding features.
§Reference epoch and scales
When using the conversion functions Dt::to and Dt::from the
epoch for all time scales is Dt::ZERO 2000-01-01 noon.
Many convenience constructors and accessors exist for common epochs (UNIX, GPS, Galileo, BeiDou, CXC, 1977 TT/TCG/TCB, etc.).
See the [Scale] documentation for the complete list of supported scales,
leap-second handling, historical UTC models, relativistic coordinate times
(TCG, TCB), and the lunar scales LTC / TCL (based on the LTE440 model).
§Arithmetic and manipulation
Dt provides rich const-friendly arithmetic:
- Addition and subtraction of durations
- Multiplication and division by integers or
Real(f64) floor,ceil,roundto an arbitrary unit- Many convenience increment/decrement methods (
add_1ns,sub_ms, …) - Signed difference via
to_diff_raw
Relativistic proper-time corrections and clock-drift models are supported
via convert_using_drift and related methods.
§Notes
Dtdoes not store a time scale internally. The scale is always an explicit parameter of conversion and construction methods.- Leap-second handling follows the chosen
Scale(UTC, UTCSpice, UTCSofa).
Fields§
§sec: i64§attos: u64Implementations§
Source§impl Dt
impl Dt
pub fn from_str_parse(s: &str, opts: &Option<ParseCfg>) -> Result<Dt, DtErr>
Sourcepub fn str_to_attos(s: &str, opts: &Option<ParseCfg>) -> Option<i128>
pub fn str_to_attos(s: &str, opts: &Option<ParseCfg>) -> Option<i128>
Same parsing logic as Dt::from_str, but returns attoseconds since
the library epoch: 2000-01-01 12:00:00 UTC (on the UTC scale).
Returns Some(attos) on success (negative for pre-2000 dates) or None
on any parse error.
Source§impl Dt
impl Dt
Source§impl Dt
impl Dt
Sourcepub const WIRE_VERSION: u8 = 1
pub const WIRE_VERSION: u8 = 1
Current wire format version.
Sourcepub fn to_wire_bytes(&self) -> [u8; 17]
pub fn to_wire_bytes(&self) -> [u8; 17]
Serializes this Dt into a fixed 17-byte little-endian buffer.
§Wire Format
- Byte
0: Version (WIRE_VERSION) - Bytes
[1..9]:secas little-endiani64 - Bytes
[9..17]:subsecas little-endianu64
This format is stable, portable, and suitable for network transmission, file storage, or FFI. The internal representation is always TAI.
Sourcepub fn from_wire_bytes(bytes: &[u8]) -> Option<Self>
pub fn from_wire_bytes(bytes: &[u8]) -> Option<Self>
Deserializes a Dt from exactly 17 bytes of wire data.
Returns None if the version byte is unknown.
Any subsec value ≥ 10¹⁸ is automatically normalized using
carry_attos so the resulting Dt
is always in canonical form.
§Security
Safe to call with completely untrusted input. Fixed-size format,
no allocation, no unsafe, and no possibility of code execution.
Malicious data simply produces a normalized (but still valid) Dt.
Source§impl Dt
impl Dt
pub const fn to_drift_as_constant(self, rate: Dt, accel: Dt) -> Drift
pub const fn to_drift_as_rate(self, constant: Dt, accel: Dt) -> Drift
pub const fn to_drift_as_accel(self, constant: Dt, rate: Dt) -> Drift
Source§impl Dt
impl Dt
pub const fn add(self, span: Dt) -> Self
pub const fn sub(self, span: Dt) -> Self
Sourcepub const fn to_sec_f(&self) -> Real
pub const fn to_sec_f(&self) -> Real
Converts this Dt to a floating-point number of seconds since the reference epoch of its associated scale.
- The conversion is lossy, as
Realprovides approximately 15.95 decimal digits of precision.
Sourcepub const fn adjusted_advance(&mut self, elapsed: &Dt, spacetime: &Spacetime)
pub const fn adjusted_advance(&mut self, elapsed: &Dt, spacetime: &Spacetime)
Advances this Dt by the given elapsed duration while applying the relativistic proper-time correction
derived from the supplied Spacetime model.
- This method is intended for simulation of remote clocks (e.g., Earth time as observed from a spacecraft).
- For a local hardware proper-time clock, use the plain
addmethods instead.
Sourcepub const fn adjusted_advance_using_drift(
&mut self,
elapsed: &Dt,
drift: &Drift,
)
pub const fn adjusted_advance_using_drift( &mut self, elapsed: &Dt, drift: &Drift, )
Advances this Dt by the given elapsed duration while applying the relativistic proper-time correction
from a pre-computed Drift value.
- This is an optimized variant of
Dt::adjusted_advancefor callers that already hold aDriftinstance. - This method is intended for simulation of remote clocks (e.g., Earth time as observed from a spacecraft).
- For a local hardware proper-time clock, use the plain
addmethods instead.
Sourcepub const fn to_diff_raw(&self, other: Self) -> Dt
pub const fn to_diff_raw(&self, other: Self) -> Dt
Computes the signed duration between this Dt and another Dt.
Sourcepub const fn to_diff_raw_f(&self, other: Self) -> Real
pub const fn to_diff_raw_f(&self, other: Self) -> Real
Computes the signed duration between this Dt and another Dt as a float.
Sourcepub const fn add_1sec(&mut self)
pub const fn add_1sec(&mut self)
Adds exactly 1 second to this time value using saturating arithmetic.
Sourcepub const fn add_1min(&mut self)
pub const fn add_1min(&mut self)
Adds exactly 1 minute (60 seconds) to this time value using saturating arithmetic.
Sourcepub const fn add_1hr(&mut self)
pub const fn add_1hr(&mut self)
Adds exactly 1 hour (3600 seconds) to this time value using saturating arithmetic.
Sourcepub const fn add_1ms(&mut self)
pub const fn add_1ms(&mut self)
Adds exactly 1 millisecond to this time value.
This affects the subsecond component and may cause a carry into the seconds field.
Sourcepub const fn add_1us(&mut self)
pub const fn add_1us(&mut self)
Adds exactly 1 microsecond to this time value.
This affects the subsecond component and may cause a carry into the seconds field.
Sourcepub const fn add_1ns(&mut self)
pub const fn add_1ns(&mut self)
Adds exactly 1 nanosecond to this time value.
This affects the subsecond component and may cause a carry into the seconds field.
Sourcepub const fn add_sec(&mut self, n: i64)
pub const fn add_sec(&mut self, n: i64)
Adds the specified number of seconds to this time value using saturating arithmetic.
Sourcepub const fn add_min(&mut self, n: i64)
pub const fn add_min(&mut self, n: i64)
Adds the specified number of minutes to this time value using saturating arithmetic.
Sourcepub const fn add_hr(&mut self, n: i64)
pub const fn add_hr(&mut self, n: i64)
Adds the specified number of hours to this time value using saturating arithmetic.
Sourcepub const fn add_ms(&mut self, n: i64)
pub const fn add_ms(&mut self, n: i64)
Adds the specified number of milliseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn add_us(&mut self, n: i64)
pub const fn add_us(&mut self, n: i64)
Adds the specified number of microseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn add_ns(&mut self, n: i64)
pub const fn add_ns(&mut self, n: i64)
Adds the specified number of nanoseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn add_ps(&mut self, n: i64)
pub const fn add_ps(&mut self, n: i64)
Adds the specified number of picoseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn add_fs(&mut self, n: i64)
pub const fn add_fs(&mut self, n: i64)
Adds the specified number of femtoseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn add_attos(&mut self, n: i64)
pub const fn add_attos(&mut self, n: i64)
Adds the specified number of attoseconds to this time value.
Handles carry into the seconds field using saturating logic.
Sourcepub const fn sub_1hr(&mut self)
pub const fn sub_1hr(&mut self)
Subtracts exactly 1 hour (3600 seconds) from this time value using saturating arithmetic.
Sourcepub const fn sub_1min(&mut self)
pub const fn sub_1min(&mut self)
Subtracts exactly 1 minute (60 seconds) from this time value using saturating arithmetic.
Sourcepub const fn sub_1sec(&mut self)
pub const fn sub_1sec(&mut self)
Subtracts exactly 1 second from this time value using saturating arithmetic.
Sourcepub const fn sub_1ms(&mut self)
pub const fn sub_1ms(&mut self)
Subtracts exactly 1 millisecond from this time value.
This affects the subsecond component and may cause a borrow from the seconds field.
Sourcepub const fn sub_1us(&mut self)
pub const fn sub_1us(&mut self)
Subtracts exactly 1 microsecond from this time value.
This affects the subsecond component and may cause a borrow from the seconds field.
Sourcepub const fn sub_1ns(&mut self)
pub const fn sub_1ns(&mut self)
Subtracts exactly 1 nanosecond from this time value.
This affects the subsecond component and may cause a borrow from the seconds field.
Sourcepub const fn sub_sec(&mut self, n: i64)
pub const fn sub_sec(&mut self, n: i64)
Subtracts the specified number of seconds from this time value using saturating arithmetic.
Sourcepub const fn sub_min(&mut self, n: i64)
pub const fn sub_min(&mut self, n: i64)
Subtracts the specified number of minutes from this time value using saturating arithmetic.
Sourcepub const fn sub_hr(&mut self, n: i64)
pub const fn sub_hr(&mut self, n: i64)
Subtracts the specified number of hours from this time value using saturating arithmetic.
Sourcepub const fn sub_ms(&mut self, n: i64)
pub const fn sub_ms(&mut self, n: i64)
Subtracts the specified number of milliseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn sub_us(&mut self, n: i64)
pub const fn sub_us(&mut self, n: i64)
Subtracts the specified number of microseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn sub_ns(&mut self, n: i64)
pub const fn sub_ns(&mut self, n: i64)
Subtracts the specified number of nanoseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn sub_ps(&mut self, n: i64)
pub const fn sub_ps(&mut self, n: i64)
Subtracts the specified number of picoseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn sub_fs(&mut self, n: i64)
pub const fn sub_fs(&mut self, n: i64)
Subtracts the specified number of femtoseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn sub_attos(&mut self, n: i64)
pub const fn sub_attos(&mut self, n: i64)
Subtracts the specified number of attoseconds from this time value.
Handles borrow from the seconds field using saturating logic.
Sourcepub const fn to_attos(&self) -> i128
pub const fn to_attos(&self) -> i128
Total attoseconds (exact i128 representation within the representable range).
Sourcepub const fn is_positive(&self) -> bool
pub const fn is_positive(&self) -> bool
Returns true if this time is strictly positive > 0.
Sourcepub const fn mul(self, rhs: i64) -> Self
pub const fn mul(self, rhs: i64) -> Self
Multiplies this time by an integer scalar (exact).
Uses 128-bit arithmetic internally.
Sourcepub const fn div(self, rhs: i64) -> Self
pub const fn div(self, rhs: i64) -> Self
Divides this Dt by an integer scalar.
Uses truncating division (rounds toward zero), same as normal integer division.
Returns ZERO if rhs == 0.
Sourcepub const fn floor(&self, unit: Self) -> Self
pub const fn floor(&self, unit: Self) -> Self
Returns the largest multiple of unit that is ≤ self.
If unit is zero, returns self unchanged (exact, full precision).
Sourcepub const fn ceil(&self, unit: Self) -> Self
pub const fn ceil(&self, unit: Self) -> Self
Returns the smallest multiple of unit that is ≥ self.
If unit is zero, returns self unchanged (exact, full precision).
Sourcepub const fn round(&self, unit: Self) -> Self
pub const fn round(&self, unit: Self) -> Self
Returns the nearest multiple of unit.
Halfway cases round away from zero (e.g. 2.5 → 3.0, -2.5 → -3.0),
matching the behavior of the old f64::round().
- If
unitis zero, returnsselfunchanged (preserves full precision). - Uses Euclidean division internally for correct behavior on negative values.
- The result is always a multiple of
unit.
Sourcepub const fn abs_div_floor(&self, unit: Self) -> usize
pub const fn abs_div_floor(&self, unit: Self) -> usize
Returns floor(|self| / |unit|) as usize, saturating at usize::MAX.
Fully exact integer arithmetic using 128-bit intermediaries. Used by TimeRange::len.
Sourcepub const fn mul_by_f(&self, rhs: Real) -> Self
pub const fn mul_by_f(&self, rhs: Real) -> Self
- Integer part of
rhsis multiplied exactly (pure i128 arithmetic). - Fractional part (|frac| < 1) uses the 10¹⁵ scaling.
Source§impl Dt
impl Dt
Sourcepub const ZERO: Self
pub const ZERO: Self
The library’s internal reference epoch: exactly 2000-01-01 12:00:00 TAI.
[Dt::new(0, 0)].
Sourcepub const NTP_EPOCH: Self
pub const NTP_EPOCH: Self
UTP epoch.
- 1900-01-01 midnight UTC.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -3_155_716_800 sec
- 0 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const UNIX_EPOCH: Self
pub const UNIX_EPOCH: Self
UNIX epoch.
- 1970-01-01 midnight TAI.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -946_728_000 sec
- 0 attos
- Does not take into account historical UTC offsets from the “rubber time” era.
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const TAI_1977_EPOCH: Self
pub const TAI_1977_EPOCH: Self
TT/TCG/TCB/TDB epoch.
- 1977-01-01 midnight TAI.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -725_803_200 sec
- 0 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const TCL_1977_EPOCH: Self
pub const TCL_1977_EPOCH: Self
TT/TCG/TCB/TDB/TCL epoch.
- 1977-01-01 midnight TAI.
- Stored here on the TCL timescale as an offset from
Self::ZERO. - The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const CXC_EPOCH: Self
pub const CXC_EPOCH: Self
Chandra X-ray Center (CXC) Time epoch.
- 1998-01-01 midnight TT.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -63_115_233 sec
- 816000000000000000 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const GPS_EPOCH: Self
pub const GPS_EPOCH: Self
GPS/Galileo Experiment (GALEX) Time epoch.
- 1980-01-06 00:00:00 UTC.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -630_763_200 + 19 sec
- 0 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const GALILEO_EPOCH: Self
pub const GALILEO_EPOCH: Self
Galileo System Time (GST) epoch.
- 1999-08-22 00:00:00 GST.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - -11_448_000 + 19 sec
- 0 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
Sourcepub const BDT_EPOCH: Self
pub const BDT_EPOCH: Self
BeiDou Time (BDT) epoch.
- 2006-01-01 00:00:00 UTC.
- Stored here on the TAI timescale as an offset from
Self::ZERO. - 189_345_600 + 33 sec
- 0 attos
- The library’s epoch for time scales during conversions is 2000-01-01 noon.
pub const SEC_19: Self
pub const SEC_33: Self
pub const SEC_37: Self
pub const ONE_DAY: Self
Sourcepub const fn new(sec: i64, attos: u64) -> Self
pub const fn new(sec: i64, attos: u64) -> Self
Creates a new Dt from whole seconds, a subsecond part in attoseconds,
and a scale, automatically normalizing the representation.
pub const fn from_attos(attos: i128, scale: Scale) -> Self
pub const fn from_sec(sec: i64, scale: Scale) -> Self
pub const fn from_ms(ms: i128, scale: Scale) -> Self
pub const fn from_us(us: i128, scale: Scale) -> Self
pub const fn from_ns(ns: i128, scale: Scale) -> Self
pub const fn from_ps(ps: i128, scale: Scale) -> Self
pub const fn from_fs(fs: i128, scale: Scale) -> Self
pub const fn from_min(m: i64, scale: Scale) -> Self
pub const fn from_hr(h: i64, scale: Scale) -> Self
Sourcepub const fn from_hms(
hr: i64,
min: i64,
sec: i64,
ms: i128,
us: i128,
ns: i128,
scale: Scale,
) -> Self
pub const fn from_hms( hr: i64, min: i64, sec: i64, ms: i128, us: i128, ns: i128, scale: Scale, ) -> Self
Creates a Dt from hours, minutes, seconds, milliseconds, microseconds,
and nanoseconds on the supplied scale.
pub const fn from_days(d: i64, scale: Scale) -> Dt
pub const fn wk(wk: i64, scale: Scale) -> Dt
pub const fn yr(yr: i64, scale: Scale) -> Dt
Sourcepub const fn ago(self, scale: Scale) -> Dt
pub const fn ago(self, scale: Scale) -> Dt
Returns a Dt that is this duration ago from the given scale.
Sourcepub const fn from_now(self, scale: Scale) -> Dt
pub const fn from_now(self, scale: Scale) -> Dt
Returns a Dt that is this duration from now in the given scale.
Sourcepub const fn from_sec_f(sec_f: Real) -> Self
pub const fn from_sec_f(sec_f: Real) -> Self
Creates a Dt from a floating-point number of seconds.
Sourcepub const fn sec_f_to_total_attos(sec_f: f64) -> i128
pub const fn sec_f_to_total_attos(sec_f: f64) -> i128
High-precision conversion from f64 seconds to total attoseconds (i128). Uses IEEE 754 bit extraction + exact integer multiplication by 5^18.
Source§impl Dt
impl Dt
Sourcepub const fn from_unix(unix: Real, current: Scale) -> Dt
pub const fn from_unix(unix: Real, current: Scale) -> Dt
Creates a TAI Dt from a unix (1970 epoch) timestamp.
Sourcepub const fn to_ntp(&self, current: Scale, new: Scale) -> Dt
pub const fn to_ntp(&self, current: Scale, new: Scale) -> Dt
Returns this Dt but as an ntp timestamp where the:
.secfield is seconds since the epoch 1900-01-01 00:00:00 UTC..attosfield is remaining fractional seconds.
§Notes:
- Assumes this
Dtis from the 2000-01-01 noon epoch. - NTP is on an SI continuous time scale. Not UTC.
§Example:
use deep_time::{Dt, Scale};
// 2698012800
let dt = Dt::from_ymd_on(1985, 7, 1, Scale::TAI);
let ntp = dt.to_ntp(Scale::TAI, Scale::TAI);
assert_eq!(
ntp.sec, 2698012800_i64,
"ntp sec for 1985 is wrong, got: {}, expected: {}",
ntp.sec, 2698012800_i64
);
let dt2 = Dt::from_ntp(ntp.to_sec_f(), Scale::TAI);
assert_eq!(
dt.sec, dt2.sec,
"round trip to Dt got wrong sec, old: {}, new: {}",
dt.sec, dt2.sec
);
let ymd = dt2.to_ymdhms_on(Scale::TAI, Scale::TAI);
assert_eq!(ymd.yr, 1985_i64);
assert_eq!(ymd.mo, 7);
assert_eq!(ymd.day, 1);
assert_eq!(ymd.hr, 0);
assert_eq!(ymd.min, 0);
assert_eq!(ymd.sec, 0);
assert_eq!(ymd.attos, 0);Sourcepub const fn from_ntp(ntp: Real, current: Scale) -> Dt
pub const fn from_ntp(ntp: Real, current: Scale) -> Dt
Creates a TAI Dt from an ntp (1900 epoch) timestamp.
Sourcepub const fn to_gps_wk_and_tow(&self, current: Scale) -> (i64, Dt)
pub const fn to_gps_wk_and_tow(&self, current: Scale) -> (i64, Dt)
Returns the GPS week number and the exact Time of Week (TOW) for this instant when expressed in GPS Time.
- GPS Time is continuous (no leap seconds) and starts at the
Dt::GPS_EPOCH(1980-01-06 00:00:00 UTC). - The returned TOW is a full-precision
Dt(attosecond resolution) on the TAI scale.
This is the most precise way to obtain GPS week + TOW information.
Sourcepub const fn from_gps_wk_and_tow(wk: i64, tow: Dt) -> Self
pub const fn from_gps_wk_and_tow(wk: i64, tow: Dt) -> Self
Creates a Dt in GPS Time (GPS) from a GPS week number and
Time of Week (TOW).
This is the exact inverse of [Self::to_gps_week_and_tow].
week: Full GPS week number (can be negative for dates before 1980).tow: Time of Week as aDt. Values ≥ 604800 seconds are automatically carried into the week number.
The resulting Dt is always in Scale::GPS.
Sourcepub const fn from_gps_wk_and_tow_f(week: i64, tow: Real) -> Self
pub const fn from_gps_wk_and_tow_f(week: i64, tow: Real) -> Self
Creates a Dt in GPS Time from a GPS week number and
floating-point Time of Week.
This is the floating-point counterpart to Self::from_gps_wk_and_tow.
Sourcepub const fn to_gps(&self, current: Scale) -> Dt
pub const fn to_gps(&self, current: Scale) -> Dt
Returns the elapsed time since the GPS epoch as a Dt on the GPS scale.
The GPS epoch is Dt::GPS_EPOCH.
Sourcepub const fn from_gps(elapsed: Dt) -> Self
pub const fn from_gps(elapsed: Dt) -> Self
Inverse of Self::to_gps.
Sourcepub const fn from_gps_f(elapsed_sec: Real) -> Self
pub const fn from_gps_f(elapsed_sec: Real) -> Self
Floating-point version of Self::from_gps.
Sourcepub const fn to_gps_day_of_wk(&self, current: Scale) -> u8
pub const fn to_gps_day_of_wk(&self, current: Scale) -> u8
Returns the day of the GPS week (0 = Sunday, 1 = Monday, …, 6 = Saturday).
This value is computed directly from the GPS Time of Week and is independent of the Gregorian calendar or civil time.
Sourcepub const fn to_gps_tow_f(&self, current: Scale) -> Real
pub const fn to_gps_tow_f(&self, current: Scale) -> Real
Returns the Time of Week (TOW) as a floating-point value in seconds.
This is a convenience method for code that prefers f64 / Real.
For full attosecond precision use Self::to_gps_wk_and_tow.
Sourcepub const fn to_gps_wk(&self, current: Scale) -> i64
pub const fn to_gps_wk(&self, current: Scale) -> i64
Returns only the GPS week number.
Convenience method. For both the week number and the Time of Week, use
Self::to_gps_wk_and_tow.
Sourcepub const fn to_cxcsec(&self, current: Scale) -> Dt
pub const fn to_cxcsec(&self, current: Scale) -> Dt
Returns the elapsed time since the Chandra X-ray Center (CXC) epoch
as a Dt on the TT scale.
The CXC epoch is Dt::CXC_EPOCH.
Sourcepub const fn from_cxcsec(elapsed: Dt) -> Self
pub const fn from_cxcsec(elapsed: Dt) -> Self
Inverse of Self::to_cxcsec.
Sourcepub const fn from_cxcsec_f(elapsed_sec: Real) -> Self
pub const fn from_cxcsec_f(elapsed_sec: Real) -> Self
Floating-point counterpart of Self::from_cxcsec.
Sourcepub const fn to_galexsec(&self, current: Scale) -> Dt
pub const fn to_galexsec(&self, current: Scale) -> Dt
Returns the elapsed time since the GPS/Galileo Experiment (GALEX) epoch
as a Dt on the TAI scale.
The GALEX epoch is Self::GPS_EPOCH.
Sourcepub const fn from_galexsec(elapsed: Dt) -> Self
pub const fn from_galexsec(elapsed: Dt) -> Self
Inverse of Self::to_galexsec.
Sourcepub const fn from_galexsec_f(elapsed_sec: Real) -> Self
pub const fn from_galexsec_f(elapsed_sec: Real) -> Self
Floating-point counterpart of Self::from_galexsec.
Source§impl Dt
impl Dt
Sourcepub const fn from_attos_since(attos: i128, epoch: Dt) -> Self
pub const fn from_attos_since(attos: i128, epoch: Dt) -> Self
Low level constructor from total attoseconds since a given epoch.
Simply adds the total attoseconds to the epoch.
§Examples
use deep_time::Dt;
// A leap second from the middle of the table (36 leap seconds accumulated)
let original = Dt::from_ymdhms(2015, 6, 30, 23, 59, 60, 123_456_789_000_000_000);
// Round-trip through canonical attoseconds
let canon = original.to_diff_raw(Dt::UNIX_EPOCH).to_attos();
let roundtrip1 = Dt::from_attos_since(canon, Dt::UNIX_EPOCH);
assert_eq!(original, roundtrip1, "Canonical round-trip failed");Sourcepub const fn to_scale_and_then_diff(&self, to: Scale, epoch: Dt) -> Dt
pub const fn to_scale_and_then_diff(&self, to: Scale, epoch: Dt) -> Dt
Converts this instant to the target scale and returns the signed difference from the given epoch.
This is a low-level const fn used internally by higher-level conversion
methods such as to_ymdhms_on.
§Arguments
to— The time scale to convertselfinto before computing the difference.epoch— The reference epoch (e.g.Dt::UNIX_EPOCH) from which the difference is calculated.
§Returns
A Dt representing the signed difference (seconds + attoseconds) between
this instant (after conversion to to) and the provided epoch.
The returned value is a signed offset relative to epoch in the to scale.
While it is most commonly used as a pure duration, it can also be interpreted
as a timestamp when epoch is something like Dt::UNIX_EPOCH (e.g. for
generating Unix timestamps via .to_ms() or .to_sec()).
§See also
Dt::to_internal— the conversion step used internally.Dt::to_diff_raw— the raw difference method.Dt::from_diff_and_scale— the complementary operation.
§Examples
use deep_time::{Dt, Scale};
let dt = Dt::from_ymdhms(2024, 6, 15, 12, 0, 0, 0);
let diff = dt.to_scale_and_then_diff(Scale::UTC, Dt::UNIX_EPOCH);
// diff can be used as a Unix timestamp offset
let unix_ms = diff.to_ms();
assert!(unix_ms > 1_700_000_000_000);Sourcepub const fn from_diff_and_scale(diff: Dt, epoch: Dt, current: Scale) -> Self
pub const fn from_diff_and_scale(diff: Dt, epoch: Dt, current: Scale) -> Self
Creates a TAI Dt by adding a difference to an epoch and interpreting
the result on the given time scale.
This is the inverse-style counterpart to to_scale_and_then_diff
and is used by from_ymdhms_on and related constructors.
§Arguments
diff— The signed difference (as aDt) to add to the epoch.epoch— The reference epoch (commonlyDt::UNIX_EPOCHorDt::ZERO).current— The time scale on whichdiff+epochshould be interpreted.
§Returns
A Dt on the TAI scale representing the absolute instant
epoch + diff when interpreted on current.
§Notes
- The input
diffis treated as being on thecurrentscale. - The final result is always converted to TAI (the internal canonical representation).
§See also
Dt::from_dt— the underlying constructor.Dt::to_scale_and_then_diff— the complementary operation.Dt::from_ymdhms_on— a higher-level user of this function.
§Examples
use deep_time::{Dt, Scale};
let diff = Dt::new(1_718_467_200, 0); // ~2024-06-15
let dt = Dt::from_diff_and_scale(diff, Dt::UNIX_EPOCH, Scale::UTC);
let ymd = dt.to_ymdhms(Scale::TAI);
assert_eq!(ymd.yr, 2024);
assert_eq!(ymd.mo, 6);
assert_eq!(ymd.day, 15);Sourcepub const fn from(sec: i64, attos: u64, current: Scale) -> Dt
pub const fn from(sec: i64, attos: u64, current: Scale) -> Dt
Creates a TAI Dt.
- Assumes the given
secandattosare on the given scale. - See
Scalefor more information on available time scales.
§Example
use deep_time::{Dt, Scale};
let dt = Dt::from(-32, 0, Scale::UTC);
// leap seconds were added to the `-32` UTC sec
// and the returned [`Dt`] is on the TAI scale
assert_eq!(dt.sec, 0);Sourcepub const fn to_tai(&self, current: Scale) -> Dt
pub const fn to_tai(&self, current: Scale) -> Dt
Converts this instant from the given scale into TAI.
This is a convenience wrapper around Dt::from that always
returns a Dt on the TAI scale.
§Arguments
current— The time scale in whichselfis currently expressed.
§Returns
A Dt representing the same instant on the TAI scale.
§Notes
- The numerical
secandattosofselfare assumed to be oncurrent. - This method is equivalent to
Dt::from(self.sec, self.attos, current).
§See also
Dt::to— the general conversion method between any two scales.Dt::from— the underlying constructor.
§Examples
use deep_time::{Dt, Scale};
let dt_utc = Dt::from_ymdhms(2024, 6, 15, 12, 0, 0, 0);
let dt_tai = dt_utc.to_tai(Scale::UTC);
assert_eq!(dt_tai.to_ymdhms(Scale::TAI).yr, 2024);Sourcepub const fn to(&self, current: Scale, new: Scale) -> Dt
pub const fn to(&self, current: Scale, new: Scale) -> Dt
Converts this instant from one time scale to another.
This is the primary public method for converting between any two supported time scales (TAI, UTC, TT, TDB, GPS, TCG, LTC, etc.).
§Arguments
current— The time scale in whichselfis currently expressed.new— The target time scale to convert into.
§Returns
A Dt representing the same physical instant on the new scale.
If current == new, this method returns *self without any computation.
§Notes
- The numerical
secandattosofselfare assumed to be oncurrent. - The returned
Dtcontains the correctsecandattosvalues for thenewscale (the scale is never stored insideDt). - This method is
const fnand performs no heap allocation.
§See also
Dt::to_tai— convenience method that always targets TAI.Dt::from— the underlying scale conversion logic.Dt::to_internal— the internal implementation (not public API).
§Examples
use deep_time::{Dt, Scale};
let dt_tai = Dt::from_ymdhms(2024, 6, 15, 12, 0, 0, 0);
// Convert from TAI to UTC
let dt_utc = dt_tai.to(Scale::TAI, Scale::UTC);
let ymd = dt_utc.to_ymdhms(Scale::UTC);
assert_eq!(ymd.yr, 2024);
assert_eq!(ymd.mo, 6);
assert_eq!(ymd.day, 15);Sourcepub const fn convert_using_drift(self, reference: Self, drift: Drift) -> Self
pub const fn convert_using_drift(self, reference: Self, drift: Drift) -> Self
Sourcepub const fn convert_back_using_drift(
self,
reference: Self,
drift: Drift,
) -> Self
pub const fn convert_back_using_drift( self, reference: Self, drift: Drift, ) -> Self
Performs the inverse conversion of Dt::convert_using_drift, recovering the original proper
time on the source clock scale.
A fixed-point iteration (at most 16 steps) is used to solve the implicit equation. For the common case of a pure constant offset the function returns immediately without iteration.
Source§impl Dt
impl Dt
Sourcepub const fn from_jyear(jyear: Real, scale: Scale) -> Self
pub const fn from_jyear(jyear: Real, scale: Scale) -> Self
Inverse of Self::to_jyear.
Sourcepub const fn from_byear(byear: Real, scale: Scale) -> Self
pub const fn from_byear(byear: Real, scale: Scale) -> Self
Inverse of Self::to_byear.
Sourcepub const fn to_decimalyear(&self, current: Scale) -> Real
pub const fn to_decimalyear(&self, current: Scale) -> Real
Returns the decimal year (Gregorian calendar year + fraction of the year).
This is the direct equivalent of Astropy’s Time.decimalyear:
- Uses the actual length of the specific Gregorian year (365 or 366 days, plus any leap seconds on UTC/UTCSpice/etc.).
- Fully scale-aware (TAI, TT, UTC, TDB, custom clocks, …).
- Exact integer arithmetic for the year boundaries, then a high-precision
to_sec_fdivision (lossy only at the finalRealstep, same as Astropy).
Source§impl Dt
impl Dt
Sourcepub fn from_ccsds_str(input: &str) -> Result<Self, DtErr>
pub fn from_ccsds_str(input: &str) -> Result<Self, DtErr>
Generalized CCSDS ASCII Time Code parser (A or B variant).
Handles both calendar (%Y-%m-%d) and day-of-year (%Y-%j) formats.
All time components after the date portion are optional.
Sourcepub fn from_ccsds_ccs(input: &[u8]) -> Result<Dt, DtErr>
pub fn from_ccsds_ccs(input: &[u8]) -> Result<Dt, DtErr>
Parses a CCSDS CCS (Calendar Segmented Time Code) binary time code
directly into TimeParts.
Implements CCSDS 301.0-B-4 §3.4 (Level 1 only).
§P-field (exactly 1 byte)
- Bit 7: Extension flag → must be
0(we reject extensions) - Bits 6-4: Code ID =
101 - Bit 3: Calendar type (
0= Month/Day,1= Day-of-Year) - Bits 2-0: Number of subsecond BCD octets (
0–6)
§T-field (BCD, big-endian)
- 2 bytes: Year (0001–9999)
- 2 bytes: Month+Day (01-12,01-31) or Day-of-Year (001–366)
- 3 bytes: Hour (00-23), Minute (00-59), Second (00-60)
- 0–6 bytes: Fractional seconds (exactly 2 decimal digits per byte)
Epoch: 1958-01-01 00:00:00 UTC (identical to CDS).
Sourcepub fn from_ccsds_c(input: &[u8]) -> Result<Dt, DtErr>
pub fn from_ccsds_c(input: &[u8]) -> Result<Dt, DtErr>
Parses a CCSDS C (CUC – Unsegmented Time Code) binary time code
directly into Dt.
This function implements CCSDS 301.0-B-4 §3.2 (Level 1 only) with full support for the extended P-field (second octet) as defined in the standard.
§Supported formats (Level 1 only)
- 1-byte or 2-byte P-field (further extension beyond 2 bytes is rejected).
- Code ID must be
001(1958-01-01 TAI epoch). - Coarse time: 1–7 octets (base 1–4 from Octet 1 + up to 3 additional from Octet 2).
- Fractional time: 0–10 octets (base 0–3 from Octet 1 + up to 7 additional from Octet 2).
§P-field decoding (when Bit 0 of Octet 1 = 1)
- Octet 2:
- Bit 0: Further-extension flag (must be 0; we reject 3+-byte P-fields).
- Bits 1-2: Additional coarse octets (0–3).
- Bits 3-5: Additional fractional octets (0–7).
- Bits 6-7: Reserved for mission definition (ignored).
§Precision
Fractional seconds are converted to attoseconds with exact integer scaling
(value / 2^(8·n_frac)). Larger n_frac gives higher resolution (down to ~2⁻⁸⁰ s
with 10 fractional bytes).
§Returns
A Dt with scale = TAI and tz = Utc.
§Errors
- [
DtErrKind::CCSDSBinEmpty] if the input is empty. - [
DtErrKind::CCSDSBinTooShort] if the input is too short for the declared P-field / T-field sizes or otherwise malformed. - [
DtErrKind::CCSDSBinInvalidCodeId] if the Code ID is not001. - [
DtErrKind::CCSDSBinInvalidPFieldExtension] if the further-extension flag is set (3+ byte P-field, unsupported).
Sourcepub fn from_ccsds_d(input: &[u8]) -> Result<Dt, DtErr>
pub fn from_ccsds_d(input: &[u8]) -> Result<Dt, DtErr>
Parses a CCSDS D (CDS – Day Segmented Time Code) binary time code
directly into Dt.
This function implements CCSDS 301.0-B-4 §3.3 (Level 1 only).
§Supported formats
- 1-byte or 2-byte P-field.
- Code ID must be
100and Epoch bit must be0(1958-01-01 UTC epoch). n_day: 2 or 3 bytes for the day count.- Middle field is always 4 bytes of milliseconds since midnight.
- Sub-millisecond field (bits 6-7 of P-field):
00: no fractional field01: 2 bytes (microseconds of the millisecond, 0–65535)10: 4 bytes (2⁻³² of the millisecond)
§Precision
- The millisecond field is rounded to the nearest millisecond (in the encoder).
- With 2-byte sub-ms: maximum quantization error ≈ ±7.63 ns.
- With 4-byte sub-ms: maximum quantization error ≈ ±0.116 ps.
§Returns
A Dt with timescale = Utc and tz = Utc.
§Errors
- [
DtErrKind::CCSDSBinEmpty] if the input is empty. - [
DtErrKind::CCSDSBinTooShort] if the input is too short for the declared field sizes. - [
DtErrKind::CCSDSBinInvalidCodeId] if the Code ID is not100. - [
DtErrKind::CCSDSBinInvalidEpoch] if the Epoch bit is set (non-Level-1 / non-1958 epoch). - [
DtErrKind::CCSDSBinInvalidSubMillisecondCode] if bits 6-7 encode an unsupported value (0b11).
Sourcepub fn from_ccsds_bin(input: &[u8]) -> Result<Dt, DtErr>
pub fn from_ccsds_bin(input: &[u8]) -> Result<Dt, DtErr>
Auto-detects and parses a CCSDS binary time code (CUC, CDS, or CCS) based on the Code ID in the first P-field byte.
Convenience wrapper around TimeParts::from_ccsds_bin.
§Supported formats
- Code ID
001→ CUC (Unsegmented) - Code ID
100→ CDS (Day Segmented) - Code ID
101→ CCS (Calendar Segmented)
§Errors
- [
DtErrKind::CCSDSBinEmpty] if the input is empty. - [
DtErrKind::CCSDSBinInvalidCodeId] for any other Code ID.
Source§impl Dt
impl Dt
pub fn from_str( s: &str, fmt: &str, inp_can_end_before_fmt: bool, fmt_can_end_before_inp: bool, allow_partial_date: bool, ) -> Result<Dt, DtErr>
pub fn parse_fmt(strptime_fmt: &str) -> Result<StrPTimeFmt, DtErr>
pub fn from_iso_duration(s: &str) -> Result<Dt, DtErr>
Sourcepub fn looks_like_iso(s: &str) -> bool
pub fn looks_like_iso(s: &str) -> bool
Accepts: P1Y, -P2W, PT1.5H, P1DT2H30M, +P3D, p1y, P1,5S, PT0S, etc.
Rejects: anything with whitespace, lone “P”/“-P”/“PT”, “P123”, “Please wait 5m”,
“1.5h”, “P1Yabc”, “P1Y!”, or any string longer than 128 bytes.
Source§impl Dt
impl Dt
Sourcepub const fn unix_sec_to_ymd(unix_sec: i64) -> (i64, u8, u8)
pub const fn unix_sec_to_ymd(unix_sec: i64) -> (i64, u8, u8)
Converts a Unix timestamp (seconds since 1970-01-01 00:00:00 UTC) to a proleptic Gregorian date (year, month, day).
pub const fn to_gregorian_time(&self, current: Scale) -> GregorianTime
Sourcepub const fn to_ymdhms(&self, current: Scale) -> YmdHms
pub const fn to_ymdhms(&self, current: Scale) -> YmdHms
Returns the proleptic Gregorian date and wall-clock time for this instant,
- Converts to
UTCbefore creating theYmdHmsfrom whatever the providedcurrentScaleis. - See
Dt::to_ymdhmsfor more info.
Sourcepub const fn to_ymdhms_on(&self, current: Scale, new: Scale) -> YmdHms
pub const fn to_ymdhms_on(&self, current: Scale, new: Scale) -> YmdHms
Returns the proleptic Gregorian date and wall-clock time for this instant,
interpreted on the current time scale and expressed on the new time scale.
§Arguments
current— The time scale in whichselfis currently expressed.new— The time scale to convert to before creating the gregorian datetime.
To note:
If you created your Dt via Dt::from_ymd
or other similar functions, then these effectively used UTC -> TAI when creating the Dt.
So, if you want to roundtrip when calling this function with such a Dt you’ll have to
use the args (Scale::TAI, Scale::UTC).
§Returns
A YmdHms containing:
yr,mo,day— proleptic Gregorian calendar datehr(0–23),min(0–59),sec(0–60)attos— fractional second in attoseconds (0 ≤ attos < 10¹⁸)unix_attosec— total attoseconds since the Unix epoch (1970-01-01 00:00:00 UTC) when this instant is expressed in thenewscale
§Leap-second handling
If new is one of the scales that use leap seconds (UTC, UTCSpice, or UTCSofa)
and the instant falls exactly on a leap second, the returned sec will be 60.
In every other case sec is in the range 0..=59.
The implementation converts internally to TAI before checking leap-second status, ensuring correct detection regardless of the input scale.
§See also
Dt::to_ymdhms— convenience wrapper that always targetsScale::UTC.Dt::from_ymdhms_on— the inverse operation.
§Examples
use deep_time::{Dt, Scale};
// `from_ymdhms` always returns a TAI instant
let dt = Dt::from_ymdhms(2024, 6, 15, 12, 30, 45, 0);
let ymd = dt.to_ymdhms_on(Scale::TAI, Scale::UTC);
assert_eq!(ymd.yr, 2024);
assert_eq!(ymd.mo, 6);
assert_eq!(ymd.day, 15);
assert_eq!(ymd.hr, 12);
assert_eq!(ymd.min, 30);
assert_eq!(ymd.sec, 45);
assert!(ymd.attos == 0);Sourcepub const fn ymdhms_to_unix_sec(
yr: i64,
mo: u8,
day: u8,
hr: u8,
min: u8,
sec: u8,
) -> i64
pub const fn ymdhms_to_unix_sec( yr: i64, mo: u8, day: u8, hr: u8, min: u8, sec: u8, ) -> i64
Converts a proleptic Gregorian calendar date+time to a Unix timestamp (seconds since 1970-01-01 00:00:00 UTC).
Expects 1 based mo and day, and 0 based hr, min, and sec.
Sourcepub const fn jdn_to_ymd(jdn: i64) -> (i64, u8, u8)
pub const fn jdn_to_ymd(jdn: i64) -> (i64, u8, u8)
Converts a Julian Day Number (JDN) to a proleptic Gregorian calendar date.
- Returns
(year, month, day)wheremonth∈ [1, 12] andday∈ [1, 31] (standard 1-based Gregorian values). - This is the inverse of
Dt::ymd_to_jdn. - Supports the full
i64range, including negative years and year zero.
Sourcepub const fn ymd_to_jdn(yr: i64, mo: u8, day: u8) -> i64
pub const fn ymd_to_jdn(yr: i64, mo: u8, day: u8) -> i64
Computes the Julian Day Number (JDN) for a proleptic Gregorian calendar date at noon UT.
This is the inverse of [jdn_to_ymd].
§Arguments
yr- Year (anyi64; proleptic Gregorian)mo- Month (1-based:1= January,2= February, …,12= December)day- Day of the month (1-based:1= first day of the month)
The algorithm matches the standard astronomical convention used throughout the library
(ymd_to_jdn(2000, 1, 1) == 2451545).
§Notes
- This function expects 1 based
moandday. Passingmo = 0orday = 0(or other out-of-range values) will produce incorrect results as this function does not perform value clamping. - The result is the integer JDN corresponding to noon on the given date.
Sourcepub const fn is_leap_yr(yr: i64) -> bool
pub const fn is_leap_yr(yr: i64) -> bool
Returns true if the given year is a Gregorian leap year under proleptic rules.
Sourcepub const fn from_ymdhms_on(
yr: i64,
mo: u8,
day: u8,
hr: u8,
min: u8,
sec: u8,
attos: u64,
scale: Scale,
) -> Self
pub const fn from_ymdhms_on( yr: i64, mo: u8, day: u8, hr: u8, min: u8, sec: u8, attos: u64, scale: Scale, ) -> Self
Creates a TAI Dt from a proleptic gregorian date which is assumed to be on
the provided time scale.
All input components are clamped to their valid ranges:
mo→ 1..=12 1 basedday→ 1..=31 1 basedhr→ 0..=23 0 basedmin→ 0..=59 0 basedsec→ 0..=60 0 based (permits leap seconds)attos→ values ≥ 10¹⁸ are carried into the seconds field
§Notes:
- Does not perform validation on leap seconds. If 60 seconds are
provided then an extra second will be added to the resulting
Dt.
Sourcepub const fn from_ymd_on(yr: i64, mo: u8, day: u8, scale: Scale) -> Self
pub const fn from_ymd_on(yr: i64, mo: u8, day: u8, scale: Scale) -> Self
Creates a TAI Dt from a proleptic gregorian date which is assumed to be on
the provided time scale.
See Dt::from_ymdhms_on.
Sourcepub const fn from_ymdhms(
yr: i64,
mo: u8,
day: u8,
hr: u8,
min: u8,
sec: u8,
attos: u64,
) -> Self
pub const fn from_ymdhms( yr: i64, mo: u8, day: u8, hr: u8, min: u8, sec: u8, attos: u64, ) -> Self
Creates a TAI Dt from a proleptic gregorian UTC date.
See Dt::from_ymdhms_on.
Sourcepub const fn from_ymd(yr: i64, mo: u8, day: u8) -> Self
pub const fn from_ymd(yr: i64, mo: u8, day: u8) -> Self
Creates a TAI Dt from a proleptic gregorian UTC date.
See Dt::from_ymdhms_on.
Sourcepub const fn ydoy_to_jdn(yr: i64, day_of_yr: u16) -> i64
pub const fn ydoy_to_jdn(yr: i64, day_of_yr: u16) -> i64
Computes the Julian Day Number from a Gregorian year and ordinal day-of-year.
Sourcepub const fn jdn_to_wkday(jdn: i64) -> u8
pub const fn jdn_to_wkday(jdn: i64) -> u8
Converts a Julian Day Number to the corresponding weekday number (0 = Sunday … 6 = Saturday).
Sourcepub const fn ymd_to_jdn_from_iso_wk(
iso_yr: i64,
iso_wk: u8,
wkday: Weekday,
) -> i64
pub const fn ymd_to_jdn_from_iso_wk( iso_yr: i64, iso_wk: u8, wkday: Weekday, ) -> i64
Computes the Julian Day Number from an ISO week date (Monday-based week).
Sourcepub const fn ymd_to_jdn_from_wk_sun(yr: i64, wk: u8, wkday: Weekday) -> i64
pub const fn ymd_to_jdn_from_wk_sun(yr: i64, wk: u8, wkday: Weekday) -> i64
Computes the Julian Day Number from a Sunday-based week-of-year (%U).
Sourcepub const fn ymd_to_jdn_from_wk_mon(yr: i64, wk: u8, wkday: Weekday) -> i64
pub const fn ymd_to_jdn_from_wk_mon(yr: i64, wk: u8, wkday: Weekday) -> i64
Computes the Julian Day Number from a Monday-based week-of-year (%W).
Sourcepub const fn is_valid_ymd(yr: i64, mo: u8, day: u8) -> bool
pub const fn is_valid_ymd(yr: i64, mo: u8, day: u8) -> bool
Returns true if the supplied values form a valid proleptic Gregorian calendar date.
Sourcepub const fn has_iso_wk_53(yr: i64) -> bool
pub const fn has_iso_wk_53(yr: i64) -> bool
Returns true if the given Gregorian year contains an ISO week 53.
Sourcepub const fn day_of_yr(&self, current: Scale, ymd: Option<(i64, u8, u8)>) -> u16
pub const fn day_of_yr(&self, current: Scale, ymd: Option<(i64, u8, u8)>) -> u16
Returns the ordinal day of the year (1-based).
January 1 is day 1; December 31 is day 365 or 366 (in leap years).
Uses the proleptic Gregorian calendar.
Sourcepub const fn wk_sun(
&self,
current: Scale,
ymd: Option<(i64, u8, u8)>,
doy: Option<u16>,
) -> u8
pub const fn wk_sun( &self, current: Scale, ymd: Option<(i64, u8, u8)>, doy: Option<u16>, ) -> u8
Sunday-based week number (%U in strftime).
Range: 0..=53.
- Week 0 contains the days before the first Sunday of the year.
- Week 1 begins on the first Sunday of the year.
The optional ymd and doy arguments are performance optimisations
(same pattern used throughout the file for day_of_year, to_iso_wk_date, etc.).
Pass whichever you already have; the function will use the fastest path.
Sourcepub const fn wk_mon(
&self,
current: Scale,
ymd: Option<(i64, u8, u8)>,
doy: Option<u16>,
) -> u8
pub const fn wk_mon( &self, current: Scale, ymd: Option<(i64, u8, u8)>, doy: Option<u16>, ) -> u8
Monday-based week number (%W in strftime).
Range: 0..=53.
- Week 0 contains the days before the first Monday of the year.
- Week 1 begins on the first Monday of the year.
The optional ymd and doy arguments are performance optimisations
(same pattern as wk_sun, day_of_yr, to_iso_wk_date, etc.).
Sourcepub const fn to_iso_wk_date(
&self,
current: Scale,
ymd: Option<(i64, u8, u8)>,
) -> (i64, u8, Weekday)
pub const fn to_iso_wk_date( &self, current: Scale, ymd: Option<(i64, u8, u8)>, ) -> (i64, u8, Weekday)
Returns the ISO 8601 week date for this Dt.
Returns (iso_year, iso_week, weekday) where:
iso_yearis the ISO week year (may differ from the Gregorian year near year boundaries),iso_weekis the week number in the range1..=53,weekdayis aWeekdayvalue (Monday-based week).
Follows the ISO 8601 standard: weeks start on Monday and week 1 is the week containing January 4.
The optional ymd argument is a performance optimization. If provided,
it is used directly; otherwise to_gregorian_ymd
is called internally.
Source§impl Dt
impl Dt
Sourcepub const fn to_jd(&self) -> (i64, u128)
pub const fn to_jd(&self) -> (i64, u128)
Returns the exact Julian Date of this instant as (integer_days, fractional_attoseconds).
- The returned JD is expressed in the time scale of this
Dt. - The fractional part is always in
[0, ATTOS_PER_DAY).
For a float value use Self::to_jd_f.
Sourcepub const fn to_jd_f(&self) -> Real
pub const fn to_jd_f(&self) -> Real
Returns the Julian Date of this instant as a floating-point Real.
This is the lossy counterpart to Self::to_jd.
Sourcepub const fn to_mjd(&self) -> (i64, u128)
pub const fn to_mjd(&self) -> (i64, u128)
Returns the exact Modified Julian Date of this instant as (integer_days, fractional_attoseconds).
- The returned MJD is expressed in the time scale of this
Dt. - The fractional part is always in
[0, ATTOS_PER_DAY).
For a float value use Self::to_mjd_f.
Sourcepub const fn to_mjd_f(&self) -> Real
pub const fn to_mjd_f(&self) -> Real
Returns the Modified Julian Date of this instant as a floating-point Real.
This is the lossy counterpart to Self::to_mjd.
Sourcepub const fn from_jd(jd_days: i64, frac_attos: u128, on: Scale) -> Self
pub const fn from_jd(jd_days: i64, frac_attos: u128, on: Scale) -> Self
Creates a Dt from an exact Julian Date.
This is the inverse of Self::to_jd. For correct round-tripping you must
pass the same on: Scale that matches the scale of the original Dt.
Sourcepub const fn from_mjd(mjd_days: i64, frac_attos: u128, on: Scale) -> Self
pub const fn from_mjd(mjd_days: i64, frac_attos: u128, on: Scale) -> Self
Creates a Dt from an exact Modified Julian Date.
This is the inverse of Self::to_mjd. For correct round-tripping you must
pass the same on: Scale that matches the scale of the original Dt.
Sourcepub const fn from_jd_f(jd: Real, on: Scale) -> Self
pub const fn from_jd_f(jd: Real, on: Scale) -> Self
Creates a Dt from a float Julian Date.
This is the inverse of Self::to_jd_f. For correct round-tripping you must
pass the same on: Scale that matches the scale of the original Dt.
Sourcepub const fn from_mjd_f(mjd: Real, on: Scale) -> Self
pub const fn from_mjd_f(mjd: Real, on: Scale) -> Self
Creates a Dt from a float Modified Julian Date.
This is the inverse of Self::to_mjd_f. For correct round-tripping you must
pass the same on: Scale that matches the scale of the original Dt.
Source§impl Dt
impl Dt
Sourcepub const fn cmp(&self, other: &Self) -> Ordering
pub const fn cmp(&self, other: &Self) -> Ordering
Compares the time values represented by two Dts.
- This comparison is based on the raw
(sec, attos)representation after normalizing (without mutating self or other) any un-carried attoseconds. - Does not perform scale conversion.
Sourcepub const fn min(self, other: Self) -> Self
pub const fn min(self, other: Self) -> Self
Returns the smaller of two Dts according to the total physical-time order
defined by Self::cmp.
This is a const fn and can be used in const contexts.
Sourcepub const fn eq(&self, other: &Self) -> bool
pub const fn eq(&self, other: &Self) -> bool
True if both sides have matching sec and attos fields.
This is a const fn so it can be used in const contexts.
Sourcepub const fn lt(&self, other: &Self) -> bool
pub const fn lt(&self, other: &Self) -> bool
Returns true if this Dt is less than the other.
This is a const fn so it can be used in const contexts.
Sourcepub const fn gt(&self, other: &Self) -> bool
pub const fn gt(&self, other: &Self) -> bool
Returns true if this Dt is greater than the other.
This is a const fn so it can be used in const contexts.
Source§impl Dt
impl Dt
Sourcepub const fn tdb_minus_tt(seconds_since_j2000_tt: Real) -> Real
pub const fn tdb_minus_tt(seconds_since_j2000_tt: Real) -> Real
DE440/LTE440-tuned compact analytical TT–TDB model
Exact 13-term Fourier decomposition from LTE440 (Lu et al. 2025, Table 3)
- physical VSOP2013 annual term + tiny JPL secular corrections.
Sourcepub const fn tai_to_tdb(tai: Self) -> Self
pub const fn tai_to_tdb(tai: Self) -> Self
Converts a TAI Dt to TDB.
Sourcepub const fn tdb_to_tai(tdb: Self) -> Self
pub const fn tdb_to_tai(tdb: Self) -> Self
Converts a TDB Dt to TAI.
Source§impl Dt
impl Dt
Sourcepub const CCSDS_C_AND_D_MAX_SIZE: usize = 32
pub const CCSDS_C_AND_D_MAX_SIZE: usize = 32
Maximum size needed for a CCSDS C & D (CUC) binary packet (with extended P-field).
Sourcepub const CCSDS_CCS_MAX_SIZE: usize = 14
pub const CCSDS_CCS_MAX_SIZE: usize = 14
Maximum size needed for a CCSDS CCS binary packet (P-field + T-field).
Sourcepub fn to_ccsds_c(
&self,
current: Scale,
n_coarse: u8,
n_frac: u8,
extension: bool,
) -> Result<([u8; 32], usize), DtErr>
pub fn to_ccsds_c( &self, current: Scale, n_coarse: u8, n_frac: u8, extension: bool, ) -> Result<([u8; 32], usize), DtErr>
Formats this Dt as a CCSDS C (CUC) binary time code.
Fully configurable for round-tripping with [from_ccsds_c].
Conforms to CCSDS 301.0-B-4 §3.2 (Level 1), including full support for the
extended P-field (second octet) when n_coarse > 4 or n_frac > 3.
§Parameters
n_coarse: 1–7 (number of coarse-time octets)n_frac: 0–10 (number of fractional octets)extension: advisory flag (ignored when larger sizes force the second octet)
Sourcepub fn to_ccsds_d(
&self,
current: Scale,
n_day: u8,
sub_ms_code: u8,
extension: bool,
) -> Result<([u8; 32], usize), DtErr>
pub fn to_ccsds_d( &self, current: Scale, n_day: u8, sub_ms_code: u8, extension: bool, ) -> Result<([u8; 32], usize), DtErr>
Formats this Dt as a CCSDS D (CDS) binary time code.
Fully configurable for round-tripping with [from_ccsds_d].
Conforms to CCSDS 301.0-B-4 §3.3 (Level 1): UTC day count + ms-of-day since 1958-01-01 UTC.
Sourcepub fn to_ccsds_ccs(
&self,
current: Scale,
use_doy: bool,
n_subsec: u8,
) -> Result<([u8; 14], usize), DtErr>
pub fn to_ccsds_ccs( &self, current: Scale, use_doy: bool, n_subsec: u8, ) -> Result<([u8; 14], usize), DtErr>
Formats this Dt as a CCSDS CCS (Calendar Segmented Time Code).
Implements CCSDS 301.0-B-4 §3.4 (Level 1 only).
§Parameters
use_doy:false= Month/Day variant (most common),true= Day-of-Year variantn_subsec: Number of subsecond BCD octets (0–6). Each octet holds 2 decimal digits.
§Returns
(buffer, written_len) — the P-field + T-field (big-endian BCD).
§Precision & Rounding
Fractional seconds are rounded to the nearest representable value at the chosen precision
(exactly as to_ccsds_d does for milliseconds).
Source§impl Dt
impl Dt
Sourcepub fn to_iso_duration(&self) -> String
pub fn to_iso_duration(&self) -> String
Converts this Dt to an ISO 8601 duration string
(e.g. "PT1H23M45.6789S", "-PT0.5S", "PT0.000000000000000001S", or "PT0S").
- This method is only available when the
allocfeature is enabled. - It returns
alloc::string::String(no_std + alloc compatible).
Sourcepub fn to_str(&self, current: Scale, fmt: &str) -> Result<String, DtErr>
pub fn to_str(&self, current: Scale, fmt: &str) -> Result<String, DtErr>
High-level allocating formatter (defaults to UTC / label-only).
Equivalent to Self::to_str_with_offset with secs = 0.
This is the convenient alloc version of Self::to_str_bin.
Sourcepub fn to_str_with_offset(
&self,
current: Scale,
fmt: &str,
secs: i32,
) -> Result<String, DtErr>
pub fn to_str_with_offset( &self, current: Scale, fmt: &str, secs: i32, ) -> Result<String, DtErr>
High-level allocating formatter with a fixed UTC offset.
- The civil time is adjusted by the given offset before formatting,
and
%z/%:zdirectives will reflect that offset. - IANA name/abbreviation are not set.
This is the convenient alloc version of Self::to_str_bin_with_offset.
Sourcepub fn to_str_with_tz(
&self,
current: Scale,
fmt: &str,
tz_name: &str,
) -> Result<String, DtErr>
pub fn to_str_with_tz( &self, current: Scale, fmt: &str, tz_name: &str, ) -> Result<String, DtErr>
High-level allocating formatter with full IANA timezone support (Jiff-compatible directive behavior).
Performs a correct UTC-based IANA lookup so that the following directives produce accurate results:
%Q/%:Q→ full IANA timezone name (e.g.America/New_York)%Z→ timezone abbreviation (e.g.EDT). These do not round-trip.%z/%:z→ numeric offset
This is the convenient alloc version of Self::to_str_bin_with_tz.
Source§impl Dt
impl Dt
Sourcepub fn to_str_bin(
&self,
current: Scale,
fmt: &str,
) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
pub fn to_str_bin( &self, current: Scale, fmt: &str, ) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
Formats this Dt into a fixed-size ASCII string without any heap allocation.
The datetime is first converted to Gregorian civil time on the given
current scale, UTC (offset = 0, no timezone abbreviation or IANA
name). This is the simplest no-alloc formatter.
§Errors
Returns DtErr if the format string contains invalid specifiers
or if the internal formatting buffer overflows (extremely unlikely
with STRFTIME_SIZE).
Sourcepub fn to_str_bin_with_offset(
&self,
current: Scale,
fmt: &str,
secs: i32,
) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
pub fn to_str_bin_with_offset( &self, current: Scale, fmt: &str, secs: i32, ) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
Formats this Dt into a fixed-size ASCII string without any heap allocation,
applying a fixed UTC offset.
- The civil time is adjusted by the given
secsoffset before formatting, and the offset is stored so that%z/%:zdirectives will reflect it. - No IANA timezone name or abbreviation is set.
Sourcepub fn to_str_bin_with_tz(
&self,
current: Scale,
fmt: &str,
tz_name: &str,
) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
pub fn to_str_bin_with_tz( &self, current: Scale, fmt: &str, tz_name: &str, ) -> Result<AsciiStr<STRFTIME_SIZE>, DtErr>
Formats this Dt into a fixed-size ASCII string without any heap allocation,
adjusting to the given IANA timezone.
This performs a correct UTC-based lookup in the IANA transition table,
so the resulting GregorianTime contains:
- accurate civil time
- correct numeric offset (for
%z/%:z) - timezone abbreviation (for
%Z). These do not round-trip. - full IANA timezone name (for
%Q/%:Q)
Use this method when you want full IANA-aware formatting (%Q, %Z,
%z, etc.).
Sourcepub fn to_u8_with_offset(
&self,
current: Scale,
fmt: &str,
dest: &mut [u8],
secs: i32,
) -> Result<usize, DtErr>
pub fn to_u8_with_offset( &self, current: Scale, fmt: &str, dest: &mut [u8], secs: i32, ) -> Result<usize, DtErr>
Low-level no-alloc formatter that writes into a caller-provided slice, using a fixed UTC offset.
Same logic as Self::to_str_bin_with_offset, but writes directly into
dest (truncated to dest.len()) and returns the number of bytes written.
Sourcepub fn to_u8_with_tz(
&self,
current: Scale,
fmt: &str,
dest: &mut [u8],
tz_name: &str,
) -> Result<usize, DtErr>
pub fn to_u8_with_tz( &self, current: Scale, fmt: &str, dest: &mut [u8], tz_name: &str, ) -> Result<usize, DtErr>
Low-level no-alloc formatter that writes into a caller-provided slice, using a full IANA timezone.
Same logic as Self::to_str_bin_with_tz, but writes directly into
dest (truncated to dest.len()) and returns the number of bytes written.
Source§impl Dt
impl Dt
Sourcepub fn proper_time_from_states<I>(
samples: I,
characteristic_length_scale: Real,
) -> Result<Self, DtErr>
pub fn proper_time_from_states<I>( samples: I, characteristic_length_scale: Real, ) -> Result<Self, DtErr>
Computes the relativistic clock drift (proper time minus coordinate time) over an interval.
This returns how much a physical clock has gained or lost time compared
with coordinate time between start and end.
- A positive result means the onboard clock ran fast.
- A negative result means the onboard clock ran slow.
§Parameters
start: Starting coordinate time of the interval.end: Ending coordinate time of the interval.states: Iterator of physical states. Coordinate times must be monotonically non-decreasing. It is the caller’s responsibility to ensure the provided states cover the time range fromstarttoend. The function integrates proper time over whatever states are supplied and subtracts the requested coordinate interval (end - start). Exact matching of the first and last state times tostartandendis not validated.characteristic_length_scale: See [proper_time_from_states].
§Returns
Ok(drift) — the accumulated drift (Δτ − Δt) as a Dt.
Err(DtErr) — if the states are not monotonically increasing in time.
Sourcepub fn proper_time_drift_from_states<I>(
start: Dt,
end: Dt,
states: I,
characteristic_length_scale: Real,
) -> Result<Dt, DtErr>
pub fn proper_time_drift_from_states<I>( start: Dt, end: Dt, states: I, characteristic_length_scale: Real, ) -> Result<Dt, DtErr>
Computes the relativistic clock drift (proper time minus coordinate time) over an interval.
This returns how much a physical clock has gained or lost time compared
with coordinate time between start and end.
- A positive result means the onboard clock ran fast.
- A negative result means the onboard clock ran slow.
§Parameters
start: Starting coordinate time.end: Ending coordinate time.states: Iterator of physical states covering the interval. Coordinate times must be monotonically non-decreasing. It is the caller’s responsibility to ensure the states span the requested interval (exact first/last time matching is not checked).characteristic_length_scale: See [proper_time_from_states].
§Returns
Ok(drift) — the accumulated drift (Δτ − Δt) as a Dt.
Err(DtErr) — if the states are not monotonically increasing in time.
Sourcepub fn proper_time_from_path<I>(path: I) -> Result<Self, DtErr>where
I: IntoIterator<Item = (Self, Spacetime)>,
pub fn proper_time_from_path<I>(path: I) -> Result<Self, DtErr>where
I: IntoIterator<Item = (Self, Spacetime)>,
Computes accumulated proper time along an arbitrary trajectory.
This is the core integration function of the library. It walks the supplied path segment by segment and applies the trapezoidal rule to the instantaneous proper-time rate at each step.
This approach is commonly used when integrating clock rates along sampled trajectories in astrodynamics and high-precision timing work.
The function enforces that coordinate times are monotonically non-decreasing. It performs a single pass with no heap allocation.
§Parameters
path: An iterator of(coordinate_time, Spacetime)pairs. Coordinate times must be monotonically non-decreasing.
§Returns
Ok(total_proper_time) — the accumulated proper time as a Dt.
Err(DtErr) — if the path is empty or contains any decrease in
coordinate time.
Sourcepub const fn proper_time_between_constant_rate(
self,
end: Dt,
dtau_dt: Real,
) -> Dt
pub const fn proper_time_between_constant_rate( self, end: Dt, dtau_dt: Real, ) -> Dt
Computes proper time advance over an interval when the rate is constant.
Use this for segments where conditions do not change, such as a ground station, a circular orbit, or a deep-space cruise phase with constant velocity and gravitational potential.
This is mathematically equivalent to integrating a constant rate but is more efficient and expresses intent clearly.
§Parameters
end: Ending coordinate time.dtau_dt: Constant proper-time rate (dimensionless, usually between 0 and 1).
§Returns
The accumulated proper time advance as a Dt.
Source§impl Dt
impl Dt
Sourcepub fn to_str_rfc3339(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_rfc3339(&self, current: Scale) -> Result<String, DtErr>
Returns this instant as an RFC 3339 / ISO 8601 timestamp in UTC
with the Z suffix.
- Always uses UTC (
Z= Zulu = UTC). - Default = 9 digits (nanoseconds) but automatically trims trailing zeros.
- If fractional part is zero → no decimal point at all (e.g.
...45Z). - Example:
"2024-03-14T15:30:45.123Z"
Sourcepub fn to_str_rfc3339_nf(
&self,
current: Scale,
max_precision: usize,
) -> Result<String, DtErr>
pub fn to_str_rfc3339_nf( &self, current: Scale, max_precision: usize, ) -> Result<String, DtErr>
Same as [to_str_rfc3339] but with a configurable maximum number of fractional digits
(0–18). Trailing zeros are always trimmed.
Sourcepub fn to_str_iso8601(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_iso8601(&self, current: Scale) -> Result<String, DtErr>
ISO 8601 / RFC 3339 with actual offset (modern +00:00 style).
- Uses colon-separated offset (
%:z) instead of forcingZ. - Still trims trailing zeros in the fractional part.
- Example:
"2025-04-16T14:30:45.123+00:00"
Sourcepub fn to_str_iso8601_basic(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_iso8601_basic(&self, current: Scale) -> Result<String, DtErr>
Compact ISO 8601 basic format (no separators).
- Useful for filenames, URLs, database keys, etc.
- Example:
"20250416T143045.123456789Z"
Sourcepub fn to_str_http(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_http(&self, current: Scale) -> Result<String, DtErr>
HTTP-date format (RFC 7231 / RFC 1123) — always in GMT.
This is the format used in Date, Expires, Last-Modified headers.
Example: "Wed, 16 Apr 2025 14:30:45 GMT"
Sourcepub fn to_str_rfc2822(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_rfc2822(&self, current: Scale) -> Result<String, DtErr>
RFC 2822 date format (used in email Date headers).
Example: "Wed, 16 Apr 2025 14:30:45 +0000"
Sourcepub fn to_str_iso_week_date(&self, current: Scale) -> Result<String, DtErr>
pub fn to_str_iso_week_date(&self, current: Scale) -> Result<String, DtErr>
ISO 8601 week date.
Example: "2025-W16-3" (year-week-day)
Source§impl Dt
impl Dt
Sourcepub fn to_ccsds_str(&self, current: Scale) -> Result<String, DtErr>
pub fn to_ccsds_str(&self, current: Scale) -> Result<String, DtErr>
Returns this instant as a CCSDS ASCII Time Code (calendar variant A).
Example: "2025-04-17T14:30:45.123456789Z"
- Uses
Tseparator and trailingZ. - Fractional seconds are trimmed (no trailing zeros, no dot if zero).
- Perfect round-trip with
Dt::from_ccsds_str/TimeParts::from_ccsds_str.
Sourcepub fn to_ccsds_str_nf(
&self,
current: Scale,
max_precision: usize,
) -> Result<String, DtErr>
pub fn to_ccsds_str_nf( &self, current: Scale, max_precision: usize, ) -> Result<String, DtErr>
Same as [to_ccsds_str] but lets you control the maximum number of fractional digits (0–18).
Source§impl Dt
impl Dt
Sourcepub const fn to_msd(&self, current: Scale) -> (i64, u128)
pub const fn to_msd(&self, current: Scale) -> (i64, u128)
Returns the exact Mars Sol Date (MSD) as a tuple of integer sols and the fractional part of a sol.
- The computation follows the canonical NASA GISS / AM2000 formulation and works for any input
Scale. - Leap seconds are automatically accounted for when converting from UTC.
Sourcepub const fn to_mtc(&self, current: Scale) -> Dt
pub const fn to_mtc(&self, current: Scale) -> Dt
Returns Mars Coordinated Time (MTC) as a Dt representing
seconds into the current sol (range [0, one Martian sol)).
Sourcepub const fn from_msd(whole_sols: i64, frac_attos: u128) -> Self
pub const fn from_msd(whole_sols: i64, frac_attos: u128) -> Self
Creates a Dt (in TT) from an exact Mars Sol Date using full library precision.
Sourcepub const fn from_msd_f(msd: Real) -> Self
pub const fn from_msd_f(msd: Real) -> Self
Creates a Dt (in TT) from a floating-point Mars Sol Date.
Non-exact Real.
Sourcepub const fn to_msd_f(&self, current: Scale) -> Real
pub const fn to_msd_f(&self, current: Scale) -> Real
Returns the Mars Sol Date (MSD) as a floating-point value (matches NASA Mars24 output). Non-exact Real.
Sourcepub const fn to_mars_ls(&self, current: Scale) -> Real
pub const fn to_mars_ls(&self, current: Scale) -> Real
Returns the Areocentric Solar Longitude Ls in degrees (range [0, 360)).
Ls is the angular position of the Sun as measured eastward from the Martian vernal equinox in Mars’s orbital plane. It is the standard index of Martian seasonal progression used in all mission planning, science operations, and atmospheric modeling. Due to orbital eccentricity, northern spring + summer last ~381 Earth days while autumn + winter last ~306 Earth days.
- Ls = 0° → northern vernal equinox (northern spring begins)
- Ls = 90° → northern summer solstice
- Ls = 180° → northern autumnal equinox
- Ls = 270° → northern winter solstice
Exactly reproduces the short-series analytic model (B-1 through B-5) used by the current NASA GISS Mars24 Sunclock algorithm, which is based on Allison & McEwen (2000) with the seven largest planetary perturbations.
Source: NASA Goddard Institute for Space Studies (GISS)
Title: Mars24 Sunclock — Algorithm and Worked Examples
URL: https://www.giss.nasa.gov/tools/mars24/help/algorithm.html
Updated: 2025-01-07
Works for any input Scale because it internally converts to TT.
Sourcepub const fn to_mars_lmst(&self, current: Scale, east_longitude_deg: Real) -> Dt
pub const fn to_mars_lmst(&self, current: Scale, east_longitude_deg: Real) -> Dt
Returns Local Mean Solar Time (LMST) at the given planetocentric east longitude
as a Dt representing seconds into the current Martian sol (range [0, one sol)).
LMST is the uniform mean solar time adjusted for longitude.
Longitude is east-positive (standard planetocentric convention, 0–360° E). Internally converts to TT and uses the current NASA GISS Mars24 definition of MST.
Sourcepub const fn to_mars_ltst(&self, current: Scale, east_longitude_deg: Real) -> Dt
pub const fn to_mars_ltst(&self, current: Scale, east_longitude_deg: Real) -> Dt
Returns Local True Solar Time (LTST) at the given planetocentric east longitude
as a Dt representing seconds into the current Martian sol (range [0, one sol)).
LTST is the actual sundial time (true solar time) at the location — what a local observer would see on a sundial. It equals LMST plus the Equation of Time.
Longitude is east-positive (standard planetocentric convention, 0–360° E).
Sourcepub const fn to_mars_year(&self, current: Scale) -> i64
pub const fn to_mars_year(&self, current: Scale) -> i64
Returns the integer Mars Year (MY) for this instant.
Mars Year numbering follows the standard Clancy et al. (2000) system:
- Mars Year 1 begins at the northern vernal equinox (Ls = 0°) on 1955 April 11.
- Each Mars Year is one tropical year on Mars (686.9725 Earth days).
- Current missions operate in Mars Year 36–37 (as of 2026).
This is the canonical year count used in all Mars science literature, mission reports, and atmospheric databases.
Source: Clancy et al. (2000), J. Geophys. Res.: Planets 105(E4), 9553–9572; confirmed in NASA GISS Mars24 Technical Notes (2025) and LMD Mars Climate Database.
To get the fractional progress through the year, simply use:
self.to_mars_ls(current) / 360.0
Source§impl Dt
impl Dt
Sourcepub fn to_hifitime(&self, current: Scale) -> Epoch
pub fn to_hifitime(&self, current: Scale) -> Epoch
Converts this Dt to a hifitime::Epoch (TAI scale).
Round-trips perfectly with [Dt::from_hifitime].
Sourcepub fn to_hifitime_duration(&self) -> Duration
pub fn to_hifitime_duration(&self) -> Duration
Converts this Span to a hifitime::Duration (nanosecond precision).
- Sub-nanosecond attoseconds are truncated toward zero.
- The conversion is fully exact up to the nanosecond (128-bit integer arithmetic).
- Internally uses
hifitime::Duration::from_total_nanoseconds, which automatically normalizes centuries/nanoseconds and saturates atDuration::MAX/Duration::MINif outside hifitime’s range (±32,768 centuries).
Sourcepub fn from_hifitime_epoch(epoch: Epoch) -> Self
pub fn from_hifitime_epoch(epoch: Epoch) -> Self
Creates a Dt from a hifitime::Epoch.
- The conversion is exact (within hifitime’s nanosecond precision).
- Uses a runtime-computed offset so it always matches whatever calendar math hifitime uses (including negative years).
Sourcepub fn from_hifitime_duration(dur: Duration) -> Self
pub fn from_hifitime_duration(dur: Duration) -> Self
Creates a Dt from a hifitime::Duration (nanosecond precision).
This is the exact reverse of Dt::to_hifitime_duration.
Source§impl Dt
impl Dt
Sourcepub fn from_chrono_datetime_utc(dt: DateTime<Utc>) -> Self
pub fn from_chrono_datetime_utc(dt: DateTime<Utc>) -> Self
Creates a Dt from a chrono::DateTime<chrono::Utc>.
This is the inverse of Dt::to_chrono_datetime_utc.
Sourcepub fn from_chrono_duration(dur: Duration) -> Self
pub fn from_chrono_duration(dur: Duration) -> Self
Creates a Dt from a chrono::Duration (nanosecond precision).
Sourcepub fn to_chrono_datetime_utc(&self, current: Scale) -> DateTime<Utc>
pub fn to_chrono_datetime_utc(&self, current: Scale) -> DateTime<Utc>
Converts this Dt to a chrono::DateTime<chrono::Utc>.
- Sub-nanosecond attoseconds are truncated toward zero.
- Saturates at the minimum/maximum representable
DateTime<Utc>(roughly years 1678–2262) if the instant is out of range.
Sourcepub fn to_chrono_duration(&self) -> Duration
pub fn to_chrono_duration(&self) -> Duration
Converts this Dt to a chrono::Duration (nanosecond precision).
- Sub-nanosecond attoseconds are truncated toward zero.
- The conversion is fully exact up to the nanosecond (128-bit integer arithmetic).
- Saturates at
chrono::Duration::MIN/chrono::Duration::MAX(roughly ±292 million years) if the value is out of range.
Source§impl Dt
impl Dt
Sourcepub fn to_jiff_timestamp(&self, current: Scale) -> Timestamp
pub fn to_jiff_timestamp(&self, current: Scale) -> Timestamp
Converts this Dt to a jiff::Timestamp (always in UTC).
Sourcepub fn to_jiff_span(&self) -> Span
pub fn to_jiff_span(&self) -> Span
Converts this Dt to a jiff::Span (seconds + nanoseconds only).
Sourcepub fn to_jiff_signed_duration(&self) -> SignedDuration
pub fn to_jiff_signed_duration(&self) -> SignedDuration
Converts this Span to a jiff::SignedDuration (nanosecond precision).
- Sub-nanosecond attoseconds are truncated toward zero.
- Supports the entire range of
Span(never saturates).
Sourcepub fn from_jiff_timestamp(ts: Timestamp) -> Self
pub fn from_jiff_timestamp(ts: Timestamp) -> Self
Creates a Dt from a jiff::Timestamp.
This is the inverse of Dt::to_jiff_timestamp.
Sourcepub fn from_jiff_signed_duration(dur: SignedDuration) -> Self
pub fn from_jiff_signed_duration(dur: SignedDuration) -> Self
Creates a Dt from a jiff::SignedDuration (nanosecond precision).
This is the inverse of Dt::to_jiff_signed_duration.
Sourcepub fn from_jiff_span(span: Span) -> Result<Self, DtErr>
pub fn from_jiff_span(span: Span) -> Result<Self, DtErr>
Creates a Dt from a jiff::Dt.
This is the inverse of Dt::to_jiff_span.
Source§impl Dt
impl Dt
Sourcepub const fn carry_attos_mut(&mut self) -> &mut Self
pub const fn carry_attos_mut(&mut self) -> &mut Self
Normalizes the representation so that the attosecond part lies in the range [0, ATTOS_PER_SEC).
Sourcepub const fn carry_attos(&self) -> Self
pub const fn carry_attos(&self) -> Self
Normalizes the representation so that the attosecond part lies in the range [0, ATTOS_PER_SEC).
Source§impl Dt
impl Dt
Sourcepub const SHAPIRO_SOLAR: Self
pub const SHAPIRO_SOLAR: Self
Shapiro gravitational time scale for the Sun (2 G M_☉ / c³).
Recommended value for the Sun when building the bodies slice passed to
ObserverState::shapiro_delay, ObserverState::shapiro_delay,
and related methods.
Sourcepub const fn shapiro_from_grav_param(gm: Real) -> Self
pub const fn shapiro_from_grav_param(gm: Real) -> Self
Creates the Shapiro delay scale for an arbitrary central body
from its standard gravitational parameter GM (μ) in m³ s⁻².
This produces the coefficient used in the Shapiro gravitational time delay formula. It is the recommended way to create a custom Shapiro scale for planets, stars, or other massive bodies.
The returned value is intended to be used for the bodies parameter
when calling ObserverState::shapiro_delay or
ObserverState::shapiro_delay.
Sourcepub const fn to_observer_state(
self,
position: Position,
velocity: Velocity,
grav_potential_m2_s2: Real,
characteristic_length_scale: Real,
) -> ObserverState
pub const fn to_observer_state( self, position: Position, velocity: Velocity, grav_potential_m2_s2: Real, characteristic_length_scale: Real, ) -> ObserverState
Creates an ObserverState using this time value along with the
provided position, velocity, and gravitational information.
An ObserverState represents a complete snapshot of an observer
(spacecraft, ground station, planet, etc.) at a specific moment.
It bundles together the time, position, velocity, and local
gravitational environment so that relativistic calculations
(light time, clock rates, Shapiro delay, etc.) can be performed.
This method is a convenience constructor. It is useful when you
already have a Dt (a time value) and want to build an
ObserverState directly from it, rather than calling
ObserverState::new or [ObserverState::new_strong_field].
§Parameters
position: The observer’s position in meters (typically expressed in a barycentric or heliocentric frame).velocity: The observer’s velocity in meters per second.grav_potential_m2_s2: The total Newtonian gravitational potential (Φ) at the observer’s location, in m²/s². This is usually negative for bound orbits and is the sum of contributions from the Sun and planets.characteristic_length_scale: A length scale (in meters) over which gravity varies significantly at this location. Use0.0for normal solar-system and weak-field cases. Only provide a non-zero value when working in strong gravitational fields.
§When to use this method
Use this method when you already have a time value as a Dt and
want to construct an ObserverState in one step. It is especially
convenient when working with time values that were previously
computed or converted.
For most normal use, ObserverState::new is simpler. Use
[ObserverState::new_strong_field] instead if you need to specify
a non-zero characteristic_length_scale.
§Example
let t = Dt::from_sec(1234.5);
let state = t.to_observer_state(
position,
velocity,
grav_potential,
0.0, // normal solar-system use
);Source§impl Dt
impl Dt
Sourcepub const fn every(self, step: Dt) -> Every
pub const fn every(self, step: Dt) -> Every
Starts building an evenly-spaced time range.
This method returns an Every builder that can be chained with
.until(end) or .up_to(end) to create a TimeRange iterator.
§Example
use deep_time::{Dt, Scale};
let start = Dt::from_ymd(2000, 1, 1);
let end = Dt::from_ymd(2000, 1, 2);
let step = Dt::from_hr(1, Scale::TAI);
for timestamp in start.every(step).to_including(end) {
println!("{:?}", timestamp.to_ymdhms(Scale::TAI));
}Sourcepub const fn range(self, end: Dt, step: Dt) -> TimeRange ⓘ
pub const fn range(self, end: Dt, step: Dt) -> TimeRange ⓘ
Creates an exclusive evenly-spaced range from self to end.
Equivalent to self.every(step).up_to(end).
Sourcepub fn next_n(self, n: usize, step: Dt) -> impl ExactSizeIterator<Item = Dt>
pub fn next_n(self, n: usize, step: Dt) -> impl ExactSizeIterator<Item = Dt>
Returns the next n points after self (exclusive of self)
at the given step.
This is a convenient way to get future points without including the start.
Sourcepub fn for_n_steps(
self,
n: usize,
step: Dt,
) -> impl ExactSizeIterator<Item = Dt>
pub fn for_n_steps( self, n: usize, step: Dt, ) -> impl ExactSizeIterator<Item = Dt>
Returns an iterator yielding exactly n evenly spaced points
starting from self.
This is a convenient one-liner for the common “next N steps” pattern.
Source§impl Dt
impl Dt
pub const fn leap_sec(&self, is_utc: bool) -> LeapInfo
pub const fn leap_sec_using( &self, is_utc: bool, table: &[LeapSecond], ) -> LeapInfo
Source§impl Dt
impl Dt
Sourcepub fn leap_sec_from_file<P: AsRef<Path>>(path: P) -> Result<Vec<LeapSecond>>
pub fn leap_sec_from_file<P: AsRef<Path>>(path: P) -> Result<Vec<LeapSecond>>
Load directly from a file (e.g. the official IANA leap-seconds.list).
Format should be the same as the file available at: https://data.iana.org/time-zones/data/leap-seconds.list
For rows that don’t start with # (the data rows) the first column should be the NTP timestamp, the second column (separated by whitespace) should be the offset against TAI in seconds (the number of leap seconds at that point).
e.g.
| #NTP Time | DTAI |
|---|---|
| # | |
| 2272060800 | 10 |
| 2287785600 | 11 |
| 2303683200 | 12 |
Source§impl Dt
impl Dt
Sourcepub fn leap_sec_from_str(s: &str) -> Vec<LeapSecond>
pub fn leap_sec_from_str(s: &str) -> Vec<LeapSecond>
Load directly from a str (e.g. the official IANA leap-seconds.list).
Format should be the same as the file available at: https://data.iana.org/time-zones/data/leap-seconds.list
For rows that don’t start with # (the data rows) the first column should be the NTP timestamp, the second column (separated by whitespace) should be the offset against TAI in seconds (the number of leap seconds at that point).
e.g.
| #NTP Time | DTAI |
|---|---|
| # | |
| 2272060800 | 10 |
| 2287785600 | 11 |
| 2303683200 | 12 |
§Example:
let table = Self::leap_sec_from_str(&file_content_as_str);Source§impl Dt
impl Dt
Sourcepub fn mjd_to_eop_offset(
mjd: Real,
op_data: &EopData,
) -> Result<EopOffset, DtErr>
pub fn mjd_to_eop_offset( mjd: Real, op_data: &EopData, ) -> Result<EopOffset, DtErr>
Get an orientation parameters offset in seconds inside a struct: (EopOffset)
for a particular Modified Julian Date.
- On Earth this would be the UT1 time scale.
- Earth Orientation Parameters data is available from: https://maia.usno.navy.mil/ser7/finals2000A.all
Sourcepub fn mjd_to_eop_offset_f(mjd: Real, op_data: &EopData) -> Result<Real, DtErr>
pub fn mjd_to_eop_offset_f(mjd: Real, op_data: &EopData) -> Result<Real, DtErr>
Get an orientation parameters offset in seconds for a particular Modified Julian Date.
- On Earth this would be the UT1 time scale.
- Earth Orientation Parameters data is available from: https://maia.usno.navy.mil/ser7/finals2000A.all
Sourcepub fn to_eop(&self, op_data: &EopData) -> Result<Self, DtErr>
pub fn to_eop(&self, op_data: &EopData) -> Result<Self, DtErr>
Offsets a Dt using orientation parameters data.
- On Earth this would be the UT1 time scale.
- Earth Orientation Parameters data is available from: https://maia.usno.navy.mil/ser7/finals2000A.all
Sourcepub fn from_eop(&self, op_data: &EopData) -> Result<Self, DtErr>
pub fn from_eop(&self, op_data: &EopData) -> Result<Self, DtErr>
Convert a Dt already offset using orientation parameters data back to whatever
it was before.
- On Earth this would be the UT1 time scale.
- Earth Orientation Parameters data is available from: https://maia.usno.navy.mil/ser7/finals2000A.all
Trait Implementations§
Source§impl AddAssign for Dt
impl AddAssign for Dt
Source§fn add_assign(&mut self, rhs: Dt)
fn add_assign(&mut self, rhs: Dt)
+= operation. Read moreSource§impl<'de> Deserialize<'de> for Dt
impl<'de> Deserialize<'de> for Dt
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl DivAssign<i64> for Dt
impl DivAssign<i64> for Dt
Source§fn div_assign(&mut self, rhs: i64)
fn div_assign(&mut self, rhs: i64)
Divides this Dt by an integer scalar in place.
Source§impl Hash for Dt
impl Hash for Dt
Source§impl MulAssign<i64> for Dt
impl MulAssign<i64> for Dt
Source§fn mul_assign(&mut self, rhs: i64)
fn mul_assign(&mut self, rhs: i64)
Multiplies this Dt by an integer scalar in place.
Source§impl Ord for Dt
impl Ord for Dt
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for Dt
impl PartialOrd for Dt
Source§impl SubAssign for Dt
impl SubAssign for Dt
Source§fn sub_assign(&mut self, rhs: Dt)
fn sub_assign(&mut self, rhs: Dt)
-= operation. Read moreSource§impl Tsify for Dt
impl Tsify for Dt
const DECL: &'static str = "/**\n * ## [`Dt`] A high-precision instant or duration with attosecond resolution.\n *\n * This is the core time type of the library. It represents both absolute\n * instants and durations using the same compact representation, making it\n * convenient anywhere precise time measurement or arithmetic is needed.\n *\n * ## Representation\n *\n * It stores:\n *\n * - `sec: i64` \u{2014} whole seconds (signed).\n * - `attos: u64` \u{2014} fractional seconds in attoseconds (`0 \u{2264} attos < 10\u{b9}\u{2078}`).\n * - These always push the `Dt` towards the positive.\n *\n * This gives a resolution of one attosecond while supporting a range of\n * roughly \u{b1}292 billion years. An [`i128`] was considered but decided against\n * due to the difficulty of math without overflow.\n *\n * There are many different ways to go to and from a `Dt` see the [`documentation`](../struct.Dt.html)\n * for the full list of methods.\n *\n * It implements `Copy` and `Clone`. Optional derives for `serde` and\n * `tsify` are available behind the corresponding features.\n *\n * ## Reference epoch and scales\n *\n * When using the conversion functions [`Dt::to`] and [`Dt::from`] the\n * epoch for **all** time scales is [`Dt::ZERO`] 2000-01-01 noon.\n *\n * Many convenience constructors and accessors exist for common epochs\n * (UNIX, GPS, Galileo, BeiDou, CXC, 1977 TT/TCG/TCB, etc.).\n *\n * See the [`Scale`] documentation for the complete list of supported scales,\n * leap-second handling, historical UTC models, relativistic coordinate times\n * (TCG, TCB), and the lunar scales LTC / TCL (based on the LTE440 model).\n *\n * ## Arithmetic and manipulation\n *\n * `Dt` provides rich const-friendly arithmetic:\n *\n * - Addition and subtraction of durations\n * - Multiplication and division by integers or `Real` (f64)\n * - `floor`, `ceil`, `round` to an arbitrary unit\n * - Many convenience increment/decrement methods (`add_1ns`, `sub_ms`, \u{2026})\n * - Signed difference via [`to_diff_raw`](Self::to_diff_raw)\n *\n * Relativistic proper-time corrections and clock-drift models are supported\n * via [`convert_using_drift`](Self::convert_using_drift) and related methods.\n *\n * ## Notes\n *\n * - `Dt` does **not** store a time scale internally. The scale is always\n * an explicit parameter of conversion and construction methods.\n * - Leap-second handling follows the chosen `Scale` (UTC, UTCSpice, UTCSofa).\n */\nexport interface Dt {\n sec: number;\n attos: number;\n}"
const SERIALIZATION_CONFIG: SerializationConfig
type JsType = JsType
fn into_js(&self) -> Result<Self::JsType, Error>where
Self: Serialize,
fn from_js<T>(js: T) -> Result<Self, Error>
impl Copy for Dt
impl Eq for Dt
Auto Trait Implementations§
impl Freeze for Dt
impl RefUnwindSafe for Dt
impl Send for Dt
impl Sync for Dt
impl Unpin for Dt
impl UnsafeUnpin for Dt
impl UnwindSafe for Dt
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.