diff --git a/src/duration.rs b/src/duration.rs index 59bfa00b74..6e29e28bed 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -350,6 +350,15 @@ impl Duration { } Ok(StdDuration::new(self.secs as u64, self.nanos as u32)) } + + /// This duplicates `Neg::neg` because trait methods can't be const yet. + pub(crate) const fn neg(self) -> Duration { + if self.nanos == 0 { + Duration { secs: -self.secs, nanos: 0 } + } else { + Duration { secs: -self.secs - 1, nanos: NANOS_PER_SEC - self.nanos } + } + } } impl Neg for Duration { diff --git a/src/naive/time/mod.rs b/src/naive/time/mod.rs index f6861c0385..b47639ce0d 100644 --- a/src/naive/time/mod.rs +++ b/src/naive/time/mod.rs @@ -639,8 +639,8 @@ impl NaiveTime { /// ``` #[inline] #[must_use] - pub fn overflowing_sub_signed(&self, rhs: OldDuration) -> (NaiveTime, i64) { - let (time, rhs) = self.overflowing_add_signed(-rhs); + pub const fn overflowing_sub_signed(&self, rhs: OldDuration) -> (NaiveTime, i64) { + let (time, rhs) = self.overflowing_add_signed(rhs.neg()); (time, -rhs) // safe to negate, rhs is within +/- (2^63 / 1000) }