From afc42ea07bc479a74c847f141eaf4139ef80d379 Mon Sep 17 00:00:00 2001 From: Paul Dicker Date: Fri, 29 Sep 2023 12:43:38 +0200 Subject: [PATCH] Add `Duration::new` --- src/duration.rs | 17 +++++++++++++++++ src/naive/time/mod.rs | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/duration.rs b/src/duration.rs index f4442648be..63c4ad3092 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -67,6 +67,23 @@ pub(crate) const MAX: Duration = Duration { }; impl Duration { + /// Makes a new `Duration` with given number of seconds and nanoseconds. + /// + /// # Errors + /// + /// Returns `None` when the duration is out of bounds, or if `nanos` ≥ 1,000,000,000. + pub(crate) const fn new(secs: i64, nanos: u32) -> Option { + if secs < MIN.secs + || secs > MAX.secs + || nanos > 1_000_000_000 + || (secs == MAX.secs && nanos > MAX.nanos as u32) + || (secs == MIN.secs && nanos < MIN.nanos as u32) + { + return None; + } + Some(Duration { secs, nanos: nanos as i32 }) + } + /// Makes a new `Duration` with given number of weeks. /// Equivalent to `Duration::seconds(weeks * 7 * 24 * 60 * 60)` with overflow checks. /// Panics when the duration is out of bounds. diff --git a/src/naive/time/mod.rs b/src/naive/time/mod.rs index de29fa465e..e05bc99eda 100644 --- a/src/naive/time/mod.rs +++ b/src/naive/time/mod.rs @@ -1194,7 +1194,7 @@ impl Add for NaiveTime { // overflow during the conversion to `chrono::Duration`. // But we limit to double that just in case `self` is a leap-second. let secs = rhs.as_secs() % (2 * 24 * 60 * 60); - let d = OldDuration::from_std(Duration::new(secs, rhs.subsec_nanos())).unwrap(); + let d = OldDuration::new(secs as i64, rhs.subsec_nanos()).unwrap(); self.overflowing_add_signed(d).0 } } @@ -1304,7 +1304,7 @@ impl Sub for NaiveTime { // overflow during the conversion to `chrono::Duration`. // But we limit to double that just in case `self` is a leap-second. let secs = rhs.as_secs() % (2 * 24 * 60 * 60); - let d = OldDuration::from_std(Duration::new(secs, rhs.subsec_nanos())).unwrap(); + let d = OldDuration::new(secs as i64, rhs.subsec_nanos()).unwrap(); self.overflowing_sub_signed(d).0 } }