pub trait Sub<Rhs = Self> {
type Output;
// Required method
fn sub(self, rhs: Rhs) -> Self::Output;
}
Expand description
The subtraction operator -
.
Note that Rhs
is Self
by default, but this is not mandatory. For
example, std::time::SystemTime
implements Sub<Duration>
, which permits
operations of the form SystemTime = SystemTime - Duration
.
ยงExamples
ยงSub
tractable points
use std::ops::Sub;
#[derive(Debug, Copy, Clone, PartialEq)]
struct Point {
x: i32,
y: i32,
}
impl Sub for Point {
type Output = Self;
fn sub(self, other: Self) -> Self::Output {
Self {
x: self.x - other.x,
y: self.y - other.y,
}
}
}
assert_eq!(Point { x: 3, y: 3 } - Point { x: 2, y: 3 },
Point { x: 1, y: 0 });
ยงImplementing Sub
with generics
Here is an example of the same Point
struct implementing the Sub
trait
using generics.
use std::ops::Sub;
#[derive(Debug, PartialEq)]
struct Point<T> {
x: T,
y: T,
}
// Notice that the implementation uses the associated type `Output`.
impl<T: Sub<Output = T>> Sub for Point<T> {
type Output = Self;
fn sub(self, other: Self) -> Self::Output {
Point {
x: self.x - other.x,
y: self.y - other.y,
}
}
}
assert_eq!(Point { x: 2, y: 3 } - Point { x: 1, y: 0 },
Point { x: 1, y: 3 });
Required Associated Typesยง
Required Methodsยง
Implementorsยง
1.74.0 ยท Sourceยงimpl Sub for Saturating<i8>
impl Sub for Saturating<i8>
type Output = Saturating<i8>
1.74.0 ยท Sourceยงimpl Sub for Saturating<i16>
impl Sub for Saturating<i16>
type Output = Saturating<i16>
1.74.0 ยท Sourceยงimpl Sub for Saturating<i32>
impl Sub for Saturating<i32>
type Output = Saturating<i32>
1.74.0 ยท Sourceยงimpl Sub for Saturating<i64>
impl Sub for Saturating<i64>
type Output = Saturating<i64>
1.74.0 ยท Sourceยงimpl Sub for Saturating<i128>
impl Sub for Saturating<i128>
type Output = Saturating<i128>
1.74.0 ยท Sourceยงimpl Sub for Saturating<isize>
impl Sub for Saturating<isize>
type Output = Saturating<isize>
1.74.0 ยท Sourceยงimpl Sub for Saturating<u8>
impl Sub for Saturating<u8>
type Output = Saturating<u8>
1.74.0 ยท Sourceยงimpl Sub for Saturating<u16>
impl Sub for Saturating<u16>
type Output = Saturating<u16>
1.74.0 ยท Sourceยงimpl Sub for Saturating<u32>
impl Sub for Saturating<u32>
type Output = Saturating<u32>
1.74.0 ยท Sourceยงimpl Sub for Saturating<u64>
impl Sub for Saturating<u64>
type Output = Saturating<u64>
1.74.0 ยท Sourceยงimpl Sub for Saturating<u128>
impl Sub for Saturating<u128>
type Output = Saturating<u128>
1.74.0 ยท Sourceยงimpl Sub for Saturating<usize>
impl Sub for Saturating<usize>
type Output = Saturating<usize>
Sourceยงimpl Sub for NaiveDate
Subtracts another NaiveDate
from the current date.
Returns a TimeDelta
of integral numbers.
impl Sub for NaiveDate
Subtracts another NaiveDate
from the current date.
Returns a TimeDelta
of integral numbers.
This does not overflow or underflow at all,
as all possible output fits in the range of TimeDelta
.
The implementation is a wrapper around
NaiveDate::signed_duration_since
.
ยงExample
use chrono::{NaiveDate, TimeDelta};
let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
assert_eq!(from_ymd(2014, 1, 1) - from_ymd(2014, 1, 1), TimeDelta::zero());
assert_eq!(from_ymd(2014, 1, 1) - from_ymd(2013, 12, 31), TimeDelta::try_days(1).unwrap());
assert_eq!(from_ymd(2014, 1, 1) - from_ymd(2014, 1, 2), TimeDelta::try_days(-1).unwrap());
assert_eq!(from_ymd(2014, 1, 1) - from_ymd(2013, 9, 23), TimeDelta::try_days(100).unwrap());
assert_eq!(from_ymd(2014, 1, 1) - from_ymd(2013, 1, 1), TimeDelta::try_days(365).unwrap());
assert_eq!(
from_ymd(2014, 1, 1) - from_ymd(2010, 1, 1),
TimeDelta::try_days(365 * 4 + 1).unwrap()
);
assert_eq!(
from_ymd(2014, 1, 1) - from_ymd(1614, 1, 1),
TimeDelta::try_days(365 * 400 + 97).unwrap()
);
Sourceยงimpl Sub for NaiveDateTime
Subtracts another NaiveDateTime
from the current date and time.
This does not overflow or underflow at all.
impl Sub for NaiveDateTime
Subtracts another NaiveDateTime
from the current date and time.
This does not overflow or underflow at all.
As a part of Chronoโs leap second handling,
the subtraction assumes that there is no leap second ever,
except when any of the NaiveDateTime
s themselves represents a leap second
in which case the assumption becomes that
there are exactly one (or two) leap second(s) ever.
The implementation is a wrapper around NaiveDateTime::signed_duration_since
.
ยงExample
use chrono::{NaiveDate, TimeDelta};
let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
let d = from_ymd(2016, 7, 8);
assert_eq!(
d.and_hms_opt(3, 5, 7).unwrap() - d.and_hms_opt(2, 4, 6).unwrap(),
TimeDelta::try_seconds(3600 + 60 + 1).unwrap()
);
// July 8 is 190th day in the year 2016
let d0 = from_ymd(2016, 1, 1);
assert_eq!(
d.and_hms_milli_opt(0, 7, 6, 500).unwrap() - d0.and_hms_opt(0, 0, 0).unwrap(),
TimeDelta::try_seconds(189 * 86_400 + 7 * 60 + 6).unwrap()
+ TimeDelta::try_milliseconds(500).unwrap()
);
Leap seconds are handled, but the subtraction assumes that no other leap seconds happened.
let leap = from_ymd(2015, 6, 30).and_hms_milli_opt(23, 59, 59, 1_500).unwrap();
assert_eq!(
leap - from_ymd(2015, 6, 30).and_hms_opt(23, 0, 0).unwrap(),
TimeDelta::try_seconds(3600).unwrap() + TimeDelta::try_milliseconds(500).unwrap()
);
assert_eq!(
from_ymd(2015, 7, 1).and_hms_opt(1, 0, 0).unwrap() - leap,
TimeDelta::try_seconds(3600).unwrap() - TimeDelta::try_milliseconds(500).unwrap()
);
Sourceยงimpl Sub for NaiveTime
Subtracts another NaiveTime
from the current time.
Returns a TimeDelta
within +/- 1 day.
This does not overflow or underflow at all.
impl Sub for NaiveTime
Subtracts another NaiveTime
from the current time.
Returns a TimeDelta
within +/- 1 day.
This does not overflow or underflow at all.
As a part of Chronoโs leap second handling,
the subtraction assumes that there is no leap second ever,
except when any of the NaiveTime
s themselves represents a leap second
in which case the assumption becomes that
there are exactly one (or two) leap second(s) ever.
The implementation is a wrapper around
NaiveTime::signed_duration_since
.
ยงExample
use chrono::{NaiveTime, TimeDelta};
let from_hmsm = |h, m, s, milli| NaiveTime::from_hms_milli_opt(h, m, s, milli).unwrap();
assert_eq!(from_hmsm(3, 5, 7, 900) - from_hmsm(3, 5, 7, 900), TimeDelta::zero());
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(3, 5, 7, 875),
TimeDelta::try_milliseconds(25).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(3, 5, 6, 925),
TimeDelta::try_milliseconds(975).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(3, 5, 0, 900),
TimeDelta::try_seconds(7).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(3, 0, 7, 900),
TimeDelta::try_seconds(5 * 60).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(0, 5, 7, 900),
TimeDelta::try_seconds(3 * 3600).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(4, 5, 7, 900),
TimeDelta::try_seconds(-3600).unwrap()
);
assert_eq!(
from_hmsm(3, 5, 7, 900) - from_hmsm(2, 4, 6, 800),
TimeDelta::try_seconds(3600 + 60 + 1).unwrap() + TimeDelta::try_milliseconds(100).unwrap()
);
Leap seconds are handled, but the subtraction assumes that there were no other leap seconds happened.
assert_eq!(from_hmsm(3, 0, 59, 1_000) - from_hmsm(3, 0, 59, 0), TimeDelta::try_seconds(1).unwrap());
assert_eq!(from_hmsm(3, 0, 59, 1_500) - from_hmsm(3, 0, 59, 0),
TimeDelta::try_milliseconds(1500).unwrap());
assert_eq!(from_hmsm(3, 0, 59, 1_000) - from_hmsm(3, 0, 0, 0), TimeDelta::try_seconds(60).unwrap());
assert_eq!(from_hmsm(3, 0, 0, 0) - from_hmsm(2, 59, 59, 1_000), TimeDelta::try_seconds(1).unwrap());
assert_eq!(from_hmsm(3, 0, 59, 1_000) - from_hmsm(2, 59, 59, 1_000),
TimeDelta::try_seconds(61).unwrap());
Sourceยงimpl Sub for AttrCheckFlags
impl Sub for AttrCheckFlags
type Output = AttrCheckFlags
Sourceยงimpl Sub for CredentialType
impl Sub for CredentialType
type Output = CredentialType
Sourceยงimpl Sub for DiffStatsFormat
impl Sub for DiffStatsFormat
type Output = DiffStatsFormat
Sourceยงimpl Sub for IndexAddOption
impl Sub for IndexAddOption
type Output = IndexAddOption
Sourceยงimpl Sub for IndexEntryExtendedFlag
impl Sub for IndexEntryExtendedFlag
Sourceยงimpl Sub for IndexEntryFlag
impl Sub for IndexEntryFlag
type Output = IndexEntryFlag
Sourceยงimpl Sub for MergeAnalysis
impl Sub for MergeAnalysis
type Output = MergeAnalysis
Sourceยงimpl Sub for MergePreference
impl Sub for MergePreference
type Output = MergePreference
Sourceยงimpl Sub for OdbLookupFlags
impl Sub for OdbLookupFlags
type Output = OdbLookupFlags
Sourceยงimpl Sub for PathspecFlags
impl Sub for PathspecFlags
type Output = PathspecFlags
Sourceยงimpl Sub for ReferenceFormat
impl Sub for ReferenceFormat
type Output = ReferenceFormat
Sourceยงimpl Sub for RemoteUpdateFlags
impl Sub for RemoteUpdateFlags
type Output = RemoteUpdateFlags
Sourceยงimpl Sub for RepositoryInitMode
impl Sub for RepositoryInitMode
type Output = RepositoryInitMode
Sourceยงimpl Sub for RepositoryOpenFlags
impl Sub for RepositoryOpenFlags
Sourceยงimpl Sub for RevparseMode
impl Sub for RevparseMode
type Output = RevparseMode
Sourceยงimpl Sub for StashApplyFlags
impl Sub for StashApplyFlags
type Output = StashApplyFlags
Sourceยงimpl Sub for StashFlags
impl Sub for StashFlags
type Output = StashFlags
Sourceยงimpl Sub for SubmoduleStatus
impl Sub for SubmoduleStatus
type Output = SubmoduleStatus
Sourceยงimpl Sub for CipherCtxFlags
impl Sub for CipherCtxFlags
type Output = CipherCtxFlags
Sourceยงimpl Sub for CMSOptions
impl Sub for CMSOptions
type Output = CMSOptions
Sourceยงimpl Sub for Pkcs7Flags
impl Sub for Pkcs7Flags
type Output = Pkcs7Flags
Sourceยงimpl Sub for ExtensionContext
impl Sub for ExtensionContext
type Output = ExtensionContext
Sourceยงimpl Sub for ShutdownState
impl Sub for ShutdownState
type Output = ShutdownState
Sourceยงimpl Sub for SslOptions
impl Sub for SslOptions
type Output = SslOptions
Sourceยงimpl Sub for SslSessionCacheMode
impl Sub for SslSessionCacheMode
Sourceยงimpl Sub for SslVerifyMode
impl Sub for SslVerifyMode
type Output = SslVerifyMode
Sourceยงimpl Sub for X509CheckFlags
impl Sub for X509CheckFlags
type Output = X509CheckFlags
Sourceยงimpl Sub for X509VerifyFlags
impl Sub for X509VerifyFlags
type Output = X509VerifyFlags
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i8>> for &Saturating<i8>
impl Sub<&Saturating<i8>> for &Saturating<i8>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i8>> for Saturating<i8>
impl Sub<&Saturating<i8>> for Saturating<i8>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i16>> for &Saturating<i16>
impl Sub<&Saturating<i16>> for &Saturating<i16>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i16>> for Saturating<i16>
impl Sub<&Saturating<i16>> for Saturating<i16>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i32>> for &Saturating<i32>
impl Sub<&Saturating<i32>> for &Saturating<i32>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i32>> for Saturating<i32>
impl Sub<&Saturating<i32>> for Saturating<i32>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i64>> for &Saturating<i64>
impl Sub<&Saturating<i64>> for &Saturating<i64>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i64>> for Saturating<i64>
impl Sub<&Saturating<i64>> for Saturating<i64>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i128>> for &Saturating<i128>
impl Sub<&Saturating<i128>> for &Saturating<i128>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<i128>> for Saturating<i128>
impl Sub<&Saturating<i128>> for Saturating<i128>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<isize>> for &Saturating<isize>
impl Sub<&Saturating<isize>> for &Saturating<isize>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<isize>> for Saturating<isize>
impl Sub<&Saturating<isize>> for Saturating<isize>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u8>> for &Saturating<u8>
impl Sub<&Saturating<u8>> for &Saturating<u8>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u8>> for Saturating<u8>
impl Sub<&Saturating<u8>> for Saturating<u8>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u16>> for &Saturating<u16>
impl Sub<&Saturating<u16>> for &Saturating<u16>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u16>> for Saturating<u16>
impl Sub<&Saturating<u16>> for Saturating<u16>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u32>> for &Saturating<u32>
impl Sub<&Saturating<u32>> for &Saturating<u32>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u32>> for Saturating<u32>
impl Sub<&Saturating<u32>> for Saturating<u32>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u64>> for &Saturating<u64>
impl Sub<&Saturating<u64>> for &Saturating<u64>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u64>> for Saturating<u64>
impl Sub<&Saturating<u64>> for Saturating<u64>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u128>> for &Saturating<u128>
impl Sub<&Saturating<u128>> for &Saturating<u128>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<u128>> for Saturating<u128>
impl Sub<&Saturating<u128>> for Saturating<u128>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<usize>> for &Saturating<usize>
impl Sub<&Saturating<usize>> for &Saturating<usize>
1.74.0 ยท Sourceยงimpl Sub<&Saturating<usize>> for Saturating<usize>
impl Sub<&Saturating<usize>> for Saturating<usize>
1.8.0 ยท Sourceยงimpl Sub<Duration> for SystemTime
impl Sub<Duration> for SystemTime
type Output = SystemTime
Sourceยงimpl Sub<Duration> for NaiveDateTime
Subtract std::time::Duration
from NaiveDateTime
.
impl Sub<Duration> for NaiveDateTime
Subtract std::time::Duration
from NaiveDateTime
.
As a part of Chronoโs [leap second handling] the subtraction assumes that there is no leap
second ever, except when the NaiveDateTime
itself represents a leap second in which case
the assumption becomes that there is exactly a single leap second ever.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDateTime::checked_sub_signed
to get an Option
instead.
type Output = NaiveDateTime
Sourceยงimpl Sub<Duration> for NaiveTime
Subtract std::time::Duration
from NaiveTime
.
impl Sub<Duration> for NaiveTime
Subtract std::time::Duration
from NaiveTime
.
This wraps around and never overflows or underflows. In particular the subtraction ignores integral number of days.
ยงimpl Sub<SystemTime> for OffsetDateTime
impl Sub<SystemTime> for OffsetDateTime
ยงimpl Sub<SystemTime> for UtcDateTime
impl Sub<SystemTime> for UtcDateTime
Sourceยงimpl Sub<Months> for NaiveDate
Subtract Months
from NaiveDate
.
impl Sub<Months> for NaiveDate
Subtract Months
from NaiveDate
.
The result will be clamped to valid days in the resulting month, see checked_sub_months
for
details.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDate::checked_sub_months
to get an Option
instead.
ยงExample
use chrono::{Months, NaiveDate};
let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
assert_eq!(from_ymd(2014, 1, 1) - Months::new(11), from_ymd(2013, 2, 1));
assert_eq!(from_ymd(2014, 1, 1) - Months::new(12), from_ymd(2013, 1, 1));
assert_eq!(from_ymd(2014, 1, 1) - Months::new(13), from_ymd(2012, 12, 1));
Sourceยงimpl Sub<Months> for NaiveDateTime
Subtract Months
from NaiveDateTime
.
impl Sub<Months> for NaiveDateTime
Subtract Months
from NaiveDateTime
.
The result will be clamped to valid days in the resulting month, see
NaiveDateTime::checked_sub_months
for details.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDateTime::checked_sub_months
to get an Option
instead.
ยงExample
use chrono::{Months, NaiveDate};
assert_eq!(
NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(01, 00, 00).unwrap()
- Months::new(11),
NaiveDate::from_ymd_opt(2013, 02, 01).unwrap().and_hms_opt(01, 00, 00).unwrap()
);
assert_eq!(
NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap()
- Months::new(12),
NaiveDate::from_ymd_opt(2013, 01, 01).unwrap().and_hms_opt(00, 02, 00).unwrap()
);
assert_eq!(
NaiveDate::from_ymd_opt(2014, 01, 01).unwrap().and_hms_opt(00, 00, 03).unwrap()
- Months::new(13),
NaiveDate::from_ymd_opt(2012, 12, 01).unwrap().and_hms_opt(00, 00, 03).unwrap()
);
type Output = NaiveDateTime
Sourceยงimpl Sub<Days> for NaiveDate
Subtract Days
from NaiveDate
.
impl Sub<Days> for NaiveDate
Subtract Days
from NaiveDate
.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDate::checked_sub_days
to get an Option
instead.
Sourceยงimpl Sub<Days> for NaiveDateTime
Subtract Days
from NaiveDateTime
.
impl Sub<Days> for NaiveDateTime
Subtract Days
from NaiveDateTime
.
ยงPanics
Panics if the resulting date would be out of range.
Consider using checked_sub_days
to get an Option
instead.
type Output = NaiveDateTime
Sourceยงimpl Sub<FixedOffset> for NaiveDateTime
Subtract FixedOffset
from NaiveDateTime
.
impl Sub<FixedOffset> for NaiveDateTime
Subtract FixedOffset
from NaiveDateTime
.
ยงPanics
Panics if the resulting date would be out of range.
Consider using checked_sub_offset
to get an Option
instead.
type Output = NaiveDateTime
Sourceยงimpl Sub<FixedOffset> for NaiveTime
Subtract FixedOffset
from NaiveTime
.
impl Sub<FixedOffset> for NaiveTime
Subtract FixedOffset
from NaiveTime
.
This wraps around and never overflows or underflows. In particular the subtraction ignores integral number of days.
Sourceยงimpl Sub<TimeDelta> for NaiveDate
Subtract TimeDelta
from NaiveDate
.
impl Sub<TimeDelta> for NaiveDate
Subtract TimeDelta
from NaiveDate
.
This discards the fractional days in TimeDelta
, rounding to the closest integral number of
days towards TimeDelta::zero()
.
It is the same as the addition with a negated TimeDelta
.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDate::checked_sub_signed
to get an Option
instead.
ยงExample
use chrono::{NaiveDate, TimeDelta};
let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
assert_eq!(from_ymd(2014, 1, 1) - TimeDelta::zero(), from_ymd(2014, 1, 1));
assert_eq!(from_ymd(2014, 1, 1) - TimeDelta::try_seconds(86399).unwrap(), from_ymd(2014, 1, 1));
assert_eq!(
from_ymd(2014, 1, 1) - TimeDelta::try_seconds(-86399).unwrap(),
from_ymd(2014, 1, 1)
);
assert_eq!(from_ymd(2014, 1, 1) - TimeDelta::try_days(1).unwrap(), from_ymd(2013, 12, 31));
assert_eq!(from_ymd(2014, 1, 1) - TimeDelta::try_days(-1).unwrap(), from_ymd(2014, 1, 2));
assert_eq!(from_ymd(2014, 1, 1) - TimeDelta::try_days(364).unwrap(), from_ymd(2013, 1, 2));
assert_eq!(
from_ymd(2014, 1, 1) - TimeDelta::try_days(365 * 4 + 1).unwrap(),
from_ymd(2010, 1, 1)
);
assert_eq!(
from_ymd(2014, 1, 1) - TimeDelta::try_days(365 * 400 + 97).unwrap(),
from_ymd(1614, 1, 1)
);
Sourceยงimpl Sub<TimeDelta> for NaiveDateTime
Subtract TimeDelta
from NaiveDateTime
.
impl Sub<TimeDelta> for NaiveDateTime
Subtract TimeDelta
from NaiveDateTime
.
This is the same as the addition with a negated TimeDelta
.
As a part of Chronoโs leap second handling the subtraction assumes that there is no leap
second ever, except when the NaiveDateTime
itself represents a leap second in which case
the assumption becomes that there is exactly a single leap second ever.
ยงPanics
Panics if the resulting date would be out of range.
Consider using NaiveDateTime::checked_sub_signed
to get an Option
instead.
ยงExample
use chrono::{NaiveDate, TimeDelta};
let from_ymd = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
let d = from_ymd(2016, 7, 8);
let hms = |h, m, s| d.and_hms_opt(h, m, s).unwrap();
assert_eq!(hms(3, 5, 7) - TimeDelta::zero(), hms(3, 5, 7));
assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(1).unwrap(), hms(3, 5, 6));
assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(-1).unwrap(), hms(3, 5, 8));
assert_eq!(hms(3, 5, 7) - TimeDelta::try_seconds(3600 + 60).unwrap(), hms(2, 4, 7));
assert_eq!(
hms(3, 5, 7) - TimeDelta::try_seconds(86_400).unwrap(),
from_ymd(2016, 7, 7).and_hms_opt(3, 5, 7).unwrap()
);
assert_eq!(
hms(3, 5, 7) - TimeDelta::try_days(365).unwrap(),
from_ymd(2015, 7, 9).and_hms_opt(3, 5, 7).unwrap()
);
let hmsm = |h, m, s, milli| d.and_hms_milli_opt(h, m, s, milli).unwrap();
assert_eq!(hmsm(3, 5, 7, 450) - TimeDelta::try_milliseconds(670).unwrap(), hmsm(3, 5, 6, 780));
Leap seconds are handled, but the subtraction assumes that it is the only leap second happened.
let leap = hmsm(3, 5, 59, 1_300);
assert_eq!(leap - TimeDelta::zero(), hmsm(3, 5, 59, 1_300));
assert_eq!(leap - TimeDelta::try_milliseconds(200).unwrap(), hmsm(3, 5, 59, 1_100));
assert_eq!(leap - TimeDelta::try_milliseconds(500).unwrap(), hmsm(3, 5, 59, 800));
assert_eq!(leap - TimeDelta::try_seconds(60).unwrap(), hmsm(3, 5, 0, 300));
assert_eq!(leap - TimeDelta::try_days(1).unwrap(),
from_ymd(2016, 7, 7).and_hms_milli_opt(3, 6, 0, 300).unwrap());
type Output = NaiveDateTime
Sourceยงimpl Sub<TimeDelta> for NaiveTime
Subtract TimeDelta
from NaiveTime
.
impl Sub<TimeDelta> for NaiveTime
Subtract TimeDelta
from NaiveTime
.
This wraps around and never overflows or underflows.
In particular the subtraction ignores integral number of days.
This is the same as addition with a negated TimeDelta
.
As a part of Chronoโs leap second handling, the subtraction assumes that there is no leap
second ever, except when the NaiveTime
itself represents a leap second in which case the
assumption becomes that there is exactly a single leap second ever.
ยงExample
use chrono::{NaiveTime, TimeDelta};
let from_hmsm = |h, m, s, milli| NaiveTime::from_hms_milli_opt(h, m, s, milli).unwrap();
assert_eq!(from_hmsm(3, 5, 7, 0) - TimeDelta::zero(), from_hmsm(3, 5, 7, 0));
assert_eq!(from_hmsm(3, 5, 7, 0) - TimeDelta::try_seconds(1).unwrap(), from_hmsm(3, 5, 6, 0));
assert_eq!(
from_hmsm(3, 5, 7, 0) - TimeDelta::try_seconds(60 + 5).unwrap(),
from_hmsm(3, 4, 2, 0)
);
assert_eq!(
from_hmsm(3, 5, 7, 0) - TimeDelta::try_seconds(2 * 60 * 60 + 6 * 60).unwrap(),
from_hmsm(0, 59, 7, 0)
);
assert_eq!(
from_hmsm(3, 5, 7, 0) - TimeDelta::try_milliseconds(80).unwrap(),
from_hmsm(3, 5, 6, 920)
);
assert_eq!(
from_hmsm(3, 5, 7, 950) - TimeDelta::try_milliseconds(280).unwrap(),
from_hmsm(3, 5, 7, 670)
);
The subtraction wraps around.
assert_eq!(from_hmsm(3, 5, 7, 0) - TimeDelta::try_seconds(8*60*60).unwrap(), from_hmsm(19, 5, 7, 0));
assert_eq!(from_hmsm(3, 5, 7, 0) - TimeDelta::try_days(800).unwrap(), from_hmsm(3, 5, 7, 0));
Leap seconds are handled, but the subtraction assumes that it is the only leap second happened.
let leap = from_hmsm(3, 5, 59, 1_300);
assert_eq!(leap - TimeDelta::zero(), from_hmsm(3, 5, 59, 1_300));
assert_eq!(leap - TimeDelta::try_milliseconds(200).unwrap(), from_hmsm(3, 5, 59, 1_100));
assert_eq!(leap - TimeDelta::try_milliseconds(500).unwrap(), from_hmsm(3, 5, 59, 800));
assert_eq!(leap - TimeDelta::try_seconds(60).unwrap(), from_hmsm(3, 5, 0, 300));
assert_eq!(leap - TimeDelta::try_days(1).unwrap(), from_hmsm(3, 6, 0, 300));
ยงimpl Sub<Duration> for SystemTime
impl Sub<Duration> for SystemTime
type Output = SystemTime
ยงimpl Sub<OffsetDateTime> for SystemTime
impl Sub<OffsetDateTime> for SystemTime
ยงimpl Sub<UtcDateTime> for SystemTime
impl Sub<UtcDateTime> for SystemTime
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<i8>> for &'a Saturating<i8>
impl<'a> Sub<Saturating<i8>> for &'a Saturating<i8>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<i16>> for &'a Saturating<i16>
impl<'a> Sub<Saturating<i16>> for &'a Saturating<i16>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<i32>> for &'a Saturating<i32>
impl<'a> Sub<Saturating<i32>> for &'a Saturating<i32>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<i64>> for &'a Saturating<i64>
impl<'a> Sub<Saturating<i64>> for &'a Saturating<i64>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<i128>> for &'a Saturating<i128>
impl<'a> Sub<Saturating<i128>> for &'a Saturating<i128>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<isize>> for &'a Saturating<isize>
impl<'a> Sub<Saturating<isize>> for &'a Saturating<isize>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<u8>> for &'a Saturating<u8>
impl<'a> Sub<Saturating<u8>> for &'a Saturating<u8>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<u16>> for &'a Saturating<u16>
impl<'a> Sub<Saturating<u16>> for &'a Saturating<u16>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<u32>> for &'a Saturating<u32>
impl<'a> Sub<Saturating<u32>> for &'a Saturating<u32>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<u64>> for &'a Saturating<u64>
impl<'a> Sub<Saturating<u64>> for &'a Saturating<u64>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<u128>> for &'a Saturating<u128>
impl<'a> Sub<Saturating<u128>> for &'a Saturating<u128>
1.74.0 ยท Sourceยงimpl<'a> Sub<Saturating<usize>> for &'a Saturating<usize>
impl<'a> Sub<Saturating<usize>> for &'a Saturating<usize>
Sourceยงimpl<C> Sub for PreAlpha<C>where
C: Premultiply + Sub<Output = C>,
<C as Premultiply>::Scalar: Sub<Output = <C as Premultiply>::Scalar>,
impl<C> Sub for PreAlpha<C>where
C: Premultiply + Sub<Output = C>,
<C as Premultiply>::Scalar: Sub<Output = <C as Premultiply>::Scalar>,
Sourceยงimpl<T> Sub for Cam16UcsJab<T>where
T: Sub<Output = T>,
impl<T> Sub for Cam16UcsJab<T>where
T: Sub<Output = T>,
type Output = Cam16UcsJab<T>
Sourceยงimpl<T> Sub for Cam16UcsJmh<T>where
T: Sub<Output = T>,
impl<T> Sub for Cam16UcsJmh<T>where
T: Sub<Output = T>,
type Output = Cam16UcsJmh<T>
Sourceยงimpl<T> Sub<T> for Cam16UcsJab<T>
impl<T> Sub<T> for Cam16UcsJab<T>
type Output = Cam16UcsJab<T>
Sourceยงimpl<T> Sub<T> for Cam16UcsJmh<T>
impl<T> Sub<T> for Cam16UcsJmh<T>
type Output = Cam16UcsJmh<T>
Sourceยงimpl<Tz> Sub<Duration> for DateTime<Tz>where
Tz: TimeZone,
Subtract std::time::Duration
from DateTime
.
impl<Tz> Sub<Duration> for DateTime<Tz>where
Tz: TimeZone,
Subtract std::time::Duration
from DateTime
.
As a part of Chronoโs [leap second handling] the subtraction assumes that there is no leap
second ever, except when the DateTime
itself represents a leap second in which case
the assumption becomes that there is exactly a single leap second ever.
ยงPanics
Panics if the resulting date would be out of range.
Consider using DateTime<Tz>::checked_sub_signed
to get an Option
instead.
Sourceยงimpl<Tz> Sub<Months> for DateTime<Tz>where
Tz: TimeZone,
Subtract Months
from DateTime
.
impl<Tz> Sub<Months> for DateTime<Tz>where
Tz: TimeZone,
Subtract Months
from DateTime
.
The result will be clamped to valid days in the resulting month, see
DateTime<Tz>::checked_sub_months
for details.
ยงPanics
Panics if:
- The resulting date would be out of range.
- The local time at the resulting date does not exist or is ambiguous, for example during a daylight saving time transition.
Strongly consider using DateTime<Tz>::checked_sub_months
to get an Option
instead.
Sourceยงimpl<Tz> Sub<Days> for DateTime<Tz>where
Tz: TimeZone,
Subtract Days
from DateTime
.
impl<Tz> Sub<Days> for DateTime<Tz>where
Tz: TimeZone,
Subtract Days
from DateTime
.
ยงPanics
Panics if:
- The resulting date would be out of range.
- The local time at the resulting date does not exist or is ambiguous, for example during a daylight saving time transition.
Strongly consider using DateTime<Tz>::checked_sub_days
to get an Option
instead.
Sourceยงimpl<Tz> Sub<FixedOffset> for DateTime<Tz>where
Tz: TimeZone,
Subtract FixedOffset
from the datetime value of DateTime
(offset remains unchanged).
impl<Tz> Sub<FixedOffset> for DateTime<Tz>where
Tz: TimeZone,
Subtract FixedOffset
from the datetime value of DateTime
(offset remains unchanged).
ยงPanics
Panics if the resulting date would be out of range.
Sourceยงimpl<Tz> Sub<TimeDelta> for DateTime<Tz>where
Tz: TimeZone,
Subtract TimeDelta
from DateTime
.
impl<Tz> Sub<TimeDelta> for DateTime<Tz>where
Tz: TimeZone,
Subtract TimeDelta
from DateTime
.
This is the same as the addition with a negated TimeDelta
.
As a part of Chronoโs [leap second handling] the subtraction assumes that there is no leap
second ever, except when the DateTime
itself represents a leap second in which case
the assumption becomes that there is exactly a single leap second ever.
ยงPanics
Panics if the resulting date would be out of range.
Consider using DateTime<Tz>::checked_sub_signed
to get an Option
instead.
Sourceยงimpl<Ul, Bl, Ur> Sub<Ur> for UInt<Ul, Bl>where
Ul: Unsigned,
Bl: Bit,
Ur: Unsigned,
UInt<Ul, Bl>: PrivateSub<Ur>,
<UInt<Ul, Bl> as PrivateSub<Ur>>::Output: Trim,
Subtracting unsigned integers. We just do our PrivateSub
and then Trim
the output.
impl<Ul, Bl, Ur> Sub<Ur> for UInt<Ul, Bl>where
Ul: Unsigned,
Bl: Bit,
Ur: Unsigned,
UInt<Ul, Bl>: PrivateSub<Ur>,
<UInt<Ul, Bl> as PrivateSub<Ur>>::Output: Trim,
Subtracting unsigned integers. We just do our PrivateSub
and then Trim
the output.