Struct Duration

Source
#[non_exhaustive]
pub struct Duration { /* private fields */ }
Expand description

Well-known duration representation for Google APIs.

§Examples

let d = Duration::try_from("12.34s")?;
assert_eq!(d.seconds(), 12);
assert_eq!(d.nanos(), 340_000_000);
assert_eq!(d, Duration::new(12, 340_000_000)?);
assert_eq!(d, Duration::clamp(12, 340_000_000));

A Duration represents a signed, fixed-length span of time represented as a count of seconds and fractions of seconds at nanosecond resolution. It is independent of any calendar and concepts like “day” or “month”. It is related to Timestamp in that the difference between two Timestamp values is a Duration and it can be added or subtracted from a Timestamp. Range is approximately +-10,000 years.

§JSON Mapping

In JSON format, the Duration type is encoded as a string rather than an object, where the string ends in the suffix “s” (indicating seconds) and is preceded by the number of seconds, with nanoseconds expressed as fractional seconds. For example, 3 seconds with 0 nanoseconds should be encoded in JSON format as “3s”, while 3 seconds and 1 nanosecond should be expressed in JSON format as “3.000000001s”, and 3 seconds and 1 microsecond should be expressed in JSON format as “3.000001s”.

Implementations§

Source§

impl Duration

Source

pub const MAX_SECONDS: i64 = 315_576_000_000i64

The maximum value for the seconds component, approximately 10,000 years.

Source

pub const MIN_SECONDS: i64 = -315_576_000_000i64

The minimum value for the seconds component, approximately -10,000 years.

Source

pub const MAX_NANOS: i32 = 999_999_999i32

The maximum value for the nanos component.

Source

pub const MIN_NANOS: i32 = -999_999_999i32

The minimum value for the nanos component.

Source

pub fn new(seconds: i64, nanos: i32) -> Result<Self, DurationError>

Creates a Duration from the seconds and nanoseconds component.

§Examples
let d = Duration::new(12, 340_000_000)?;
assert_eq!(String::from(d), "12.34s");

let d = Duration::new(-12, -340_000_000)?;
assert_eq!(String::from(d), "-12.34s");
§Examples: invalid inputs
let d = Duration::new(12, 2_000_000_000);
assert!(matches!(d, Err(DurationError::OutOfRange)));

let d = Duration::new(-12, 340_000_000);
assert!(matches!(d, Err(DurationError::MismatchedSigns)));

This function validates the seconds and nanos components and returns an error if either are out of range or their signs do not match. Consider using clamp() to add nanoseconds to seconds with carry.

§Parameters
  • seconds - the seconds in the interval.
  • nanos - the nanoseconds added to the interval.
Source

pub fn clamp(seconds: i64, nanos: i32) -> Self

Create a normalized, clamped Duration.

§Examples
let d = Duration::clamp(12, 340_000_000);
assert_eq!(String::from(d), "12.34s");
let d = Duration::clamp(10, 2_000_000_000);
assert_eq!(String::from(d), "12s");

Durations must be in the [-10_000, +10_000] year range, the nanoseconds field must be in the [-999_999_999, +999_999_999] range, and the seconds and nanosecond fields must have the same sign. This function creates a new Duration instance clamped to those ranges.

The function effectively adds the nanoseconds part (with carry) to the seconds part, with saturation.

§Parameters
  • seconds - the seconds in the interval.
  • nanos - the nanoseconds added to the interval.
Source

pub fn seconds(&self) -> i64

Returns the seconds part of the duration.

§Example
let d = Duration::clamp(12, 34);
assert_eq!(d.seconds(), 12);
Source

pub fn nanos(&self) -> i32

Returns the sub-second part of the duration.

§Example
let d = Duration::clamp(12, 34);
assert_eq!(d.nanos(), 34);

Trait Implementations§

Source§

impl Clone for Duration

Source§

fn clone(&self) -> Duration

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Duration

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Duration

Source§

fn default() -> Duration

Returns the “default value” for a type. Read more
Source§

impl From<Duration> for Duration

Available on crate feature time only.

Convert from Duration to time::Duration.

This conversion is always safe because the range for Duration is guaranteed to fit into the destination type.

§Example

let d = time::Duration::from(Duration::clamp(12, 340_000_000));
assert_eq!(d.whole_seconds(), 12);
assert_eq!(d.subsec_nanoseconds(), 340_000_000);
Source§

fn from(value: Duration) -> Self

Converts to this type from the input type.
Source§

impl From<Duration> for String

Converts a Duration to its String representation.

§Example

let d = Duration::clamp(12, 340_000_000);
assert_eq!(String::from(d), "12.34s");
Source§

fn from(duration: Duration) -> String

Converts to this type from the input type.
Source§

impl From<Duration> for Duration

Available on crate feature chrono only.

Converts from Duration to chrono::Duration.

§Example

let d = chrono::Duration::from(Duration::clamp(12, 340_000_000));
assert_eq!(d.num_seconds(), 12);
assert_eq!(d.subsec_nanos(), 340_000_000);
Source§

fn from(value: Duration) -> Self

Converts to this type from the input type.
Source§

impl Message for Duration

Source§

fn typename() -> &'static str

The typename of this message.
Source§

impl PartialEq for Duration

Source§

fn eq(&self, other: &Duration) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for Duration

Source§

fn partial_cmp(&self, other: &Duration) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl TryFrom<&String> for Duration

Converts the string representation of a duration to Duration.

§Example

let s = "12.34s".to_string();
let d = Duration::try_from(&s)?;
assert_eq!(d.seconds(), 12);
assert_eq!(d.nanos(), 340_000_000);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: &String) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<&str> for Duration

Converts the string representation of a duration to Duration.

§Example

let d = Duration::try_from("12.34s")?;
assert_eq!(d.seconds(), 12);
assert_eq!(d.nanos(), 340_000_000);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: &str) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<Duration> for Duration

Convert from std::time::Duration to Duration.

§Example

let d = Duration::try_from(std::time::Duration::from_secs(123))?;
assert_eq!(d.seconds(), 123);
assert_eq!(d.nanos(), 0);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Duration) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<Duration> for Duration

Convert from Duration to std::time::Duration.

Returns an error if value is negative, as std::time::Duration cannot represent negative durations.

§Example

let d = Duration::new(12, 340_000_000)?;
let duration = std::time::Duration::try_from(d)?;
assert_eq!(duration.as_secs(), 12);
assert_eq!(duration.subsec_nanos(), 340_000_000);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Duration) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<Duration> for Duration

Available on crate feature time only.

Convert from time::Duration to Duration.

This conversion may fail if the time::Duration value is out of range.

§Example

let d = Duration::try_from(time::Duration::new(12, 340_000_000))?;
assert_eq!(d.seconds(), 12);
assert_eq!(d.nanos(), 340_000_000);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Duration) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl TryFrom<TimeDelta> for Duration

Available on crate feature chrono only.

Converts from chrono::Duration to Duration.

The conversion may fail if the input value is out of range.

§Example

let d = Duration::try_from(chrono::Duration::new(12, 340_000_000).unwrap())?;
assert_eq!(d.seconds(), 12);
assert_eq!(d.nanos(), 340_000_000);
Source§

type Error = DurationError

The type returned in the event of a conversion error.
Source§

fn try_from(value: Duration) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl Copy for Duration

Source§

impl StructuralPartialEq for Duration

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> ErasedDestructor for T
where T: 'static,