From 7d8750dd556fd2ea5e36fcb775f23f0a05e19d09 Mon Sep 17 00:00:00 2001 From: Isabel Atkinson Date: Thu, 8 Jun 2023 13:41:30 -0600 Subject: [PATCH 1/3] RUST-1677 Add subtraction methods to DateTime --- src/datetime.rs | 13 +++++++++++++ src/tests/datetime.rs | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/datetime.rs b/src/datetime.rs index 80bbb786..0f29c24e 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -389,6 +389,19 @@ impl crate::DateTime { })?; Ok(Self::from_time_0_3(odt)) } + + /// Computes `self - rhs`, returning the elapsed time as a [`Duration`] or `None` if the result is negative. + pub fn checked_sub(self, rhs: Self) -> Option { + if rhs.0 > self.0 { + return None; + } + Some(Duration::from_millis((self.0 - rhs.0) as u64)) + } + +/// Computes `self - rhs`, returning the elapsed time as a [`Duration`] or a [`Duration`] of zero if the result is negative. + pub fn saturating_sub(self, rhs: Self) -> Duration { + self.checked_sub(rhs).unwrap_or(Duration::ZERO) + } } impl fmt::Debug for crate::DateTime { diff --git a/src/tests/datetime.rs b/src/tests/datetime.rs index 8f4719c3..2bd156ce 100644 --- a/src/tests/datetime.rs +++ b/src/tests/datetime.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + use crate::tests::LOCK; #[test] @@ -38,3 +40,16 @@ fn datetime_to_rfc3339() { fn invalid_datetime_to_rfc3339() { assert!(crate::DateTime::MAX.try_to_rfc3339_string().is_err()); } + +#[test] +fn subtraction() { + let _guard = LOCK.run_concurrently(); + + let date1 = crate::DateTime::from_millis(100); + let date2 = crate::DateTime::from_millis(1000); + + assert_eq!(date2.checked_sub(date1), Some(Duration::from_millis(900))); + assert_eq!(date2.saturating_sub(date1), Duration::from_millis(900)); + assert!(date1.checked_sub(date2).is_none()); + assert_eq!(date1.saturating_sub(date2), Duration::ZERO); +} From 1b34ab6f6d27ca564edfc2f7e54666023f5ca3ef Mon Sep 17 00:00:00 2001 From: Isabel Atkinson Date: Thu, 8 Jun 2023 13:53:00 -0600 Subject: [PATCH 2/3] change names --- src/datetime.rs | 16 +++++++++------- src/tests/datetime.rs | 10 +++++----- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/datetime.rs b/src/datetime.rs index 0f29c24e..dc7bf24a 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -390,17 +390,19 @@ impl crate::DateTime { Ok(Self::from_time_0_3(odt)) } - /// Computes `self - rhs`, returning the elapsed time as a [`Duration`] or `None` if the result is negative. - pub fn checked_sub(self, rhs: Self) -> Option { - if rhs.0 > self.0 { + /// Returns the time elapsed since `earlier`, or `None` if the given `DateTime` is later than + /// this one. + pub fn checked_duration_since(self, earlier: Self) -> Option { + if earlier.0 > self.0 { return None; } - Some(Duration::from_millis((self.0 - rhs.0) as u64)) + Some(Duration::from_millis((self.0 - earlier.0) as u64)) } -/// Computes `self - rhs`, returning the elapsed time as a [`Duration`] or a [`Duration`] of zero if the result is negative. - pub fn saturating_sub(self, rhs: Self) -> Duration { - self.checked_sub(rhs).unwrap_or(Duration::ZERO) + /// Returns the time elapsed since `earlier`, or a [`Duration`] of zero if the given `DateTime` + /// is later than this one. + pub fn saturating_duration_since(self, earlier: Self) -> Duration { + self.checked_duration_since(earlier).unwrap_or(Duration::ZERO) } } diff --git a/src/tests/datetime.rs b/src/tests/datetime.rs index 2bd156ce..8a47209d 100644 --- a/src/tests/datetime.rs +++ b/src/tests/datetime.rs @@ -42,14 +42,14 @@ fn invalid_datetime_to_rfc3339() { } #[test] -fn subtraction() { +fn duration_since() { let _guard = LOCK.run_concurrently(); let date1 = crate::DateTime::from_millis(100); let date2 = crate::DateTime::from_millis(1000); - assert_eq!(date2.checked_sub(date1), Some(Duration::from_millis(900))); - assert_eq!(date2.saturating_sub(date1), Duration::from_millis(900)); - assert!(date1.checked_sub(date2).is_none()); - assert_eq!(date1.saturating_sub(date2), Duration::ZERO); + assert_eq!(date2.checked_duration_since(date1), Some(Duration::from_millis(900))); + assert_eq!(date2.saturating_duration_since(date1), Duration::from_millis(900)); + assert!(date1.checked_duration_since(date2).is_none()); + assert_eq!(date1.saturating_duration_since(date2), Duration::ZERO); } From 97264b1a98c774abcb5572b662903b3dd5544e70 Mon Sep 17 00:00:00 2001 From: Isabel Atkinson Date: Fri, 9 Jun 2023 09:24:40 -0600 Subject: [PATCH 3/3] fmt --- src/datetime.rs | 3 ++- src/tests/datetime.rs | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/datetime.rs b/src/datetime.rs index dc7bf24a..a8ce59bb 100644 --- a/src/datetime.rs +++ b/src/datetime.rs @@ -402,7 +402,8 @@ impl crate::DateTime { /// Returns the time elapsed since `earlier`, or a [`Duration`] of zero if the given `DateTime` /// is later than this one. pub fn saturating_duration_since(self, earlier: Self) -> Duration { - self.checked_duration_since(earlier).unwrap_or(Duration::ZERO) + self.checked_duration_since(earlier) + .unwrap_or(Duration::ZERO) } } diff --git a/src/tests/datetime.rs b/src/tests/datetime.rs index 8a47209d..56bba311 100644 --- a/src/tests/datetime.rs +++ b/src/tests/datetime.rs @@ -48,8 +48,14 @@ fn duration_since() { let date1 = crate::DateTime::from_millis(100); let date2 = crate::DateTime::from_millis(1000); - assert_eq!(date2.checked_duration_since(date1), Some(Duration::from_millis(900))); - assert_eq!(date2.saturating_duration_since(date1), Duration::from_millis(900)); + assert_eq!( + date2.checked_duration_since(date1), + Some(Duration::from_millis(900)) + ); + assert_eq!( + date2.saturating_duration_since(date1), + Duration::from_millis(900) + ); assert!(date1.checked_duration_since(date2).is_none()); assert_eq!(date1.saturating_duration_since(date2), Duration::ZERO); }