Struct Duration
pub struct Duration { pub(in ::time) secs: u64, pub(in ::time) nanos: Nanoseconds }
A Duration type to represent a span of time, typically used for system
timeouts.
Each Duration is composed of a whole number of seconds and a fractional part
represented in nanoseconds. If the underlying system does not support
nanosecond-level precision, APIs binding a system timeout will typically round up
the number of nanoseconds.
Durations implement many common traits, including Add, Sub, and other
ops traits. It implements Default by returning a zero-length Duration.
Examples
use Duration;
let five_seconds = new;
let five_seconds_and_five_nanos = five_seconds + new;
assert_eq!;
assert_eq!;
let ten_millis = from_millis;
Formatting Duration values
Duration intentionally does not have a Display impl, as there are a
variety of ways to format spans of time for human readability. Duration
provides a Debug impl that shows the full precision of the value.
The Debug output uses the non-ASCII "µs" suffix for microseconds. If your
program output may appear in contexts that cannot rely on full Unicode
compatibility, you may wish to format Duration objects yourself or use a
crate to do so.
Fields
secs: u64nanos: Nanoseconds
Implementations
impl Duration
const SECOND: Duration = _;The duration of one second.
Examples
use Duration; assert_eq!;const MILLISECOND: Duration = _;The duration of one millisecond.
Examples
use Duration; assert_eq!;const MICROSECOND: Duration = _;The duration of one microsecond.
Examples
use Duration; assert_eq!;const NANOSECOND: Duration = _;The duration of one nanosecond.
Examples
use Duration; assert_eq!;const ZERO: Duration = _;A duration of zero time.
Examples
use Duration; let duration = ZERO; assert!; assert_eq!;const MAX: Duration = _;The maximum duration.
May vary by platform as necessary. Must be able to contain the difference between two instances of
Instantor two instances ofSystemTime. This constraint gives it a value of about 584,942,417,355 years in practice, which is currently used on all platforms.Examples
use Duration; assert_eq!;const fn new(secs: u64, nanos: u32) -> DurationCreates a new
Durationfrom the specified number of whole seconds and additional nanoseconds.If the number of nanoseconds is greater than 1 billion (the number of nanoseconds in a second), then it will carry over into the seconds provided.
Panics
This constructor will panic if the carry from the nanoseconds overflows the seconds counter.
Examples
use Duration; let five_seconds = new;const fn from_secs(secs: u64) -> DurationCreates a new
Durationfrom the specified number of whole seconds.Examples
use Duration; let duration = from_secs; assert_eq!; assert_eq!;const fn from_millis(millis: u64) -> DurationCreates a new
Durationfrom the specified number of milliseconds.Examples
use Duration; let duration = from_millis; assert_eq!; assert_eq!;const fn from_micros(micros: u64) -> DurationCreates a new
Durationfrom the specified number of microseconds.Examples
use Duration; let duration = from_micros; assert_eq!; assert_eq!;const fn from_nanos(nanos: u64) -> DurationCreates a new
Durationfrom the specified number of nanoseconds.Note: Using this on the return value of
as_nanos()might cause unexpected behavior:as_nanos()returns a u128, and can return values that do not fit in u64, e.g. 585 years. Instead, consider using the patternDuration::new(d.as_secs(), d.subsec_nanos())if you cannot copy/clone the Duration directly.Examples
use Duration; let duration = from_nanos; assert_eq!; assert_eq!;const fn from_nanos_u128(nanos: u128) -> DurationCreates a new
Durationfrom the specified number of nanoseconds.Panics
Panics if the given number of nanoseconds is greater than
Duration::MAX.Examples
use Duration; let nanos = 10_u128.pow + 321; let duration = from_nanos_u128; assert_eq!; assert_eq!;const fn from_weeks(weeks: u64) -> DurationCreates a new
Durationfrom the specified number of weeks.Panics
Panics if the given number of weeks overflows the
Durationsize.Examples
use Duration; let duration = from_weeks; assert_eq!; assert_eq!;const fn from_days(days: u64) -> DurationCreates a new
Durationfrom the specified number of days.Panics
Panics if the given number of days overflows the
Durationsize.Examples
use Duration; let duration = from_days; assert_eq!; assert_eq!;const fn from_hours(hours: u64) -> DurationCreates a new
Durationfrom the specified number of hours.Panics
Panics if the given number of hours overflows the
Durationsize.Examples
use Duration; let duration = from_hours; assert_eq!; assert_eq!;const fn from_mins(mins: u64) -> DurationCreates a new
Durationfrom the specified number of minutes.Panics
Panics if the given number of minutes overflows the
Durationsize.Examples
use Duration; let duration = from_mins; assert_eq!; assert_eq!;const fn is_zero(&self) -> boolReturns true if this
Durationspans no time.Examples
use Duration; assert!; assert!; assert!; assert!; assert!; assert!; assert!;const fn as_secs(&self) -> u64Returns the number of whole seconds contained by this
Duration.The returned value does not include the fractional (nanosecond) part of the duration, which can be obtained using
subsec_nanos.Examples
use Duration; let duration = new; assert_eq!;To determine the total number of seconds represented by the
Durationincluding the fractional part, useas_secs_f64oras_secs_f32const fn subsec_millis(&self) -> u32Returns the fractional part of this
Duration, in whole milliseconds.This method does not return the length of the duration when represented by milliseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one thousand).
Examples
use Duration; let duration = from_millis; assert_eq!; assert_eq!;const fn subsec_micros(&self) -> u32Returns the fractional part of this
Duration, in whole microseconds.This method does not return the length of the duration when represented by microseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one million).
Examples
use Duration; let duration = from_micros; assert_eq!; assert_eq!;const fn subsec_nanos(&self) -> u32Returns the fractional part of this
Duration, in nanoseconds.This method does not return the length of the duration when represented by nanoseconds. The returned number always represents a fractional portion of a second (i.e., it is less than one billion).
Examples
use Duration; let duration = from_millis; assert_eq!; assert_eq!;const fn as_millis(&self) -> u128Returns the total number of whole milliseconds contained by this
Duration.Examples
use Duration; let duration = new; assert_eq!;const fn as_micros(&self) -> u128Returns the total number of whole microseconds contained by this
Duration.Examples
use Duration; let duration = new; assert_eq!;const fn as_nanos(&self) -> u128Returns the total number of nanoseconds contained by this
Duration.Examples
use Duration; let duration = new; assert_eq!;const fn abs_diff(self, other: Duration) -> DurationComputes the absolute difference between
selfandother.Examples
use Duration; assert_eq!; assert_eq!;const fn checked_add(self, rhs: Duration) -> Option<Duration>Checked
Durationaddition. Computesself + other, returningNoneif overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn saturating_add(self, rhs: Duration) -> DurationSaturating
Durationaddition. Computesself + other, returningDuration::MAXif overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn checked_sub(self, rhs: Duration) -> Option<Duration>Checked
Durationsubtraction. Computesself - other, returningNoneif the result would be negative or if overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn saturating_sub(self, rhs: Duration) -> DurationSaturating
Durationsubtraction. Computesself - other, returningDuration::ZEROif the result would be negative or if overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn checked_mul(self, rhs: u32) -> Option<Duration>Checked
Durationmultiplication. Computesself * other, returningNoneif overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn saturating_mul(self, rhs: u32) -> DurationSaturating
Durationmultiplication. Computesself * other, returningDuration::MAXif overflow occurred.Examples
use Duration; assert_eq!; assert_eq!;const fn checked_div(self, rhs: u32) -> Option<Duration>Checked
Durationdivision. Computesself / other, returningNoneifother == 0.Examples
use Duration; assert_eq!; assert_eq!; assert_eq!;const fn as_secs_f64(&self) -> f64Returns the number of seconds contained by this
Durationasf64.The returned value includes the fractional (nanosecond) part of the duration.
Examples
use Duration; let dur = new; assert_eq!;const fn as_secs_f32(&self) -> f32Returns the number of seconds contained by this
Durationasf32.The returned value includes the fractional (nanosecond) part of the duration.
Examples
use Duration; let dur = new; assert_eq!;const fn as_millis_f64(&self) -> f64Returns the number of milliseconds contained by this
Durationasf64.The returned value includes the fractional (nanosecond) part of the duration.
Examples
use Duration; let dur = new; assert_eq!;const fn as_millis_f32(&self) -> f32Returns the number of milliseconds contained by this
Durationasf32.The returned value includes the fractional (nanosecond) part of the duration.
Examples
use Duration; let dur = new; assert_eq!;fn from_secs_f64(secs: f64) -> DurationCreates a new
Durationfrom the specified number of seconds represented asf64.Panics
This constructor will panic if
secsis negative, overflowsDurationor not finite.Examples
use Duration; let res = from_secs_f64; assert_eq!; let res = from_secs_f64; assert_eq!; let res = from_secs_f64; assert_eq!; let res = from_secs_f64; assert_eq!; let res = from_secs_f64; assert_eq!; // subnormal float let res = from_secs_f64; assert_eq!; // conversion uses rounding let res = from_secs_f64; assert_eq!;fn from_secs_f32(secs: f32) -> DurationCreates a new
Durationfrom the specified number of seconds represented asf32.Panics
This constructor will panic if
secsis negative, overflowsDurationor not finite.Examples
use Duration; let res = from_secs_f32; assert_eq!; let res = from_secs_f32; assert_eq!; let res = from_secs_f32; assert_eq!; let res = from_secs_f32; assert_eq!; let res = from_secs_f32; assert_eq!; // subnormal float let res = from_secs_f32; assert_eq!; // conversion uses rounding let res = from_secs_f32; assert_eq!;fn mul_f64(self, rhs: f64) -> DurationMultiplies
Durationbyf64.Panics
This method will panic if result is negative, overflows
Durationor not finite.Examples
use Duration; let dur = new; assert_eq!; assert_eq!;Note that
f64does not have enough bits (f64::MANTISSA_DIGITS) to represent the full range of possibleDurationwith nanosecond precision, so rounding may occur even for trivial operations like multiplying by 1.# use Duration; // This is about 14.9 weeks, remaining precise to the nanosecond: let weeks = from_nanos; assert_eq!; // A larger value incurs rounding in the floating-point operation: let weeks = from_nanos; assert_ne!; // This is over 285 million years, remaining precise to the second: let years = from_secs; assert_eq!; // And again larger values incur rounding: let years = from_secs; assert_ne!;# use std::time::Duration; // In the extreme, rounding can even overflow `Duration`, which panics. let _ = Duration::from_secs(u64::MAX).mul_f64(1.0);fn mul_f32(self, rhs: f32) -> DurationMultiplies
Durationbyf32.Since the significand of
f32is quite limited compared to the range ofDuration-- only about 16.8ms of exact nanosecond precision -- this method currently forwards to [mul_f64][Self::mul_f64] for greater accuracy.Panics
This method will panic if result is negative, overflows
Durationor not finite.Examples
use Duration; let dur = new; // Note that this `3.14_f32` argument already has more floating-point // representation error than a direct `3.14_f64` would, so the result // is slightly different from the ideal 8.478s. assert_eq!; assert_eq!;fn div_f64(self, rhs: f64) -> DurationDivides
Durationbyf64.Panics
This method will panic if result is negative, overflows
Durationor not finite.Examples
use Duration; let dur = new; assert_eq!; assert_eq!;Note that
f64does not have enough bits (f64::MANTISSA_DIGITS) to represent the full range of possibleDurationwith nanosecond precision, so rounding may occur even for trivial operations like dividing by 1.# use Duration; // This is about 14.9 weeks, remaining precise to the nanosecond: let weeks = from_nanos; assert_eq!; // A larger value incurs rounding in the floating-point operation: let weeks = from_nanos; assert_ne!; // This is over 285 million years, remaining precise to the second: let years = from_secs; assert_eq!; // And again larger values incur rounding: let years = from_secs; assert_ne!;# use std::time::Duration; // In the extreme, rounding can even overflow `Duration`, which panics. let _ = Duration::from_secs(u64::MAX).div_f64(1.0);fn div_f32(self, rhs: f32) -> DurationDivides
Durationbyf32.Since the significand of
f32is quite limited compared to the range ofDuration-- only about 16.8ms of exact nanosecond precision -- this method currently forwards to [div_f64][Self::div_f64] for greater accuracy.Panics
This method will panic if result is negative, overflows
Durationor not finite.Examples
use Duration; let dur = new; // Note that this `3.14_f32` argument already has more floating-point // representation error than a direct `3.14_f64` would, so the result // is slightly different from the ideally rounded 0.859_872_611. assert_eq!; assert_eq!;const fn div_duration_f64(self, rhs: Duration) -> f64Divides
DurationbyDurationand returnsf64.Examples
use Duration; let dur1 = new; let dur2 = new; assert_eq!;const fn div_duration_f32(self, rhs: Duration) -> f32Divides
DurationbyDurationand returnsf32.Examples
use Duration; let dur1 = new; let dur2 = new; assert_eq!;const fn div_duration_floor(self, rhs: Duration) -> u128Divides
DurationbyDurationand returnsu128, rounding the result towards zero.Examples
use Duration; let dur = new; assert_eq!; assert_eq!; assert_eq!;const fn div_duration_ceil(self, rhs: Duration) -> u128Divides
DurationbyDurationand returnsu128, rounding the result towards positive infinity.Examples
use Duration; let dur = new; assert_eq!; assert_eq!; assert_eq!;
impl Duration
fn try_from_secs_f32(secs: f32) -> Result<Duration, TryFromFloatSecsError>The checked version of
from_secs_f32.This constructor will return an
Errifsecsis negative, overflowsDurationor not finite.Examples
use Duration; let res = try_from_secs_f32; assert_eq!; let res = try_from_secs_f32; assert_eq!; let res = try_from_secs_f32; assert_eq!; let res = try_from_secs_f32; assert_eq!; let res = try_from_secs_f32; assert_eq!; // subnormal float: let res = try_from_secs_f32; assert_eq!; let res = try_from_secs_f32; assert!; let res = try_from_secs_f32; assert!; let res = try_from_secs_f32; assert!; // the conversion uses rounding with tie resolution to even let res = try_from_secs_f32; assert_eq!; // this float represents exactly 976562.5e-9 let val = f32from_bits; let res = try_from_secs_f32; assert_eq!; // this float represents exactly 2929687.5e-9 let val = f32from_bits; let res = try_from_secs_f32; assert_eq!; // this float represents exactly 1.000_976_562_5 let val = f32from_bits; let res = try_from_secs_f32; assert_eq!; // this float represents exactly 1.002_929_687_5 let val = f32from_bits; let res = try_from_secs_f32; assert_eq!;fn try_from_secs_f64(secs: f64) -> Result<Duration, TryFromFloatSecsError>The checked version of
from_secs_f64.This constructor will return an
Errifsecsis negative, overflowsDurationor not finite.Examples
use Duration; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; // subnormal float let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert!; let res = try_from_secs_f64; assert!; let res = try_from_secs_f64; assert!; // the conversion uses rounding with tie resolution to even let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; let res = try_from_secs_f64; assert_eq!; // this float represents exactly 976562.5e-9 let val = f64from_bits; let res = try_from_secs_f64; assert_eq!; // this float represents exactly 2929687.5e-9 let val = f64from_bits; let res = try_from_secs_f64; assert_eq!; // this float represents exactly 1.000_976_562_5 let val = f64from_bits; let res = try_from_secs_f64; assert_eq!; // this float represents exactly 1.002_929_687_5 let val = f64from_bits; let res = try_from_secs_f64; assert_eq!;
Trait Implementations
impl Add for Duration
type Output = Duration;fn add(self, rhs: Duration) -> Duration
impl AddAssign for Duration
fn add_assign(&mut self, rhs: Duration)
impl Clone for Duration
fn clone(&self) -> Duration
impl Copy for Duration
impl Debug for Duration
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl Default for Duration
fn default() -> Duration
impl Div<u32> for Duration
type Output = Duration;fn div(self, rhs: u32) -> Duration
impl DivAssign<u32> for Duration
fn div_assign(&mut self, rhs: u32)
impl Eq for Duration
fn assert_fields_are_eq(&self)
impl Hash for Duration
fn hash<__H: Hasher>(&self, state: &mut __H)
impl Mul<u32> for Duration
type Output = Duration;fn mul(self, rhs: u32) -> Duration
impl MulAssign<u32> for Duration
fn mul_assign(&mut self, rhs: u32)
impl Ord for Duration
fn cmp(&self, other: &Duration) -> Ordering
impl PartialEq for Duration
fn eq(&self, other: &Duration) -> bool
impl PartialOrd for Duration
fn partial_cmp(&self, other: &Duration) -> Option<Ordering>
impl StructuralPartialEq for Duration
impl Sub for Duration
type Output = Duration;fn sub(self, rhs: Duration) -> Duration
impl SubAssign for Duration
fn sub_assign(&mut self, rhs: Duration)
impl Sum for Duration
fn sum<I: Iterator<Item = Duration>>(iter: I) -> Duration
impl TrivialClone for Duration
impl<'a> Sum<&'a Duration> for Duration
fn sum<I: Iterator<Item = &'a Duration>>(iter: I) -> Duration
Auto Trait Implementations
impl Freeze for Duration
impl RefUnwindSafe for Duration
impl Send for Duration
impl Sync for Duration
impl Unpin for Duration
impl UnsafeUnpin for Duration
impl UnwindSafe for Duration
Blanket Implementations
impl<T> Any for Duration
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Duration
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Duration
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Duration
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for Duration
fn from(t: T) -> TReturns the argument unchanged.
impl<T> Printable for Duration
where
T: Copy + Debug,
impl<T> SizeHint for Duration
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for Duration
impl<T, U> Into<U> for Duration
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for Duration
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for Duration
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>