pub struct TimestampDifference { /* private fields */ }
Expand description
Options for Timestamp::since
and Timestamp::until
.
This type provides a way to configure the calculation of
spans between two Timestamp
values. In particular, both
Timestamp::since
and Timestamp::until
accept anything that implements
Into<TimestampDifference>
. There are a few key trait implementations that
make this convenient:
From<Timestamp> for TimestampDifference
will construct a configuration consisting of just the timestamp. So for example,timestamp1.until(timestamp2)
will return the span fromtimestamp1
totimestamp2
.From<Zoned> for TimestampDifference
will construct a configuration consisting of the timestamp from the given zoned datetime. So for example,timestamp.since(zoned)
returns the span fromzoned.to_timestamp()
totimestamp
.From<(Unit, Timestamp)>
is a convenient way to specify the largest units that should be present on the span returned. By default, the largest units are seconds. Using this trait implementation is equivalent toTimestampDifference::new(timestamp).largest(unit)
.From<(Unit, Zoned)>
is like the one above, but with the time from the given zoned datetime.
One can also provide a TimestampDifference
value directly. Doing so
is necessary to use the rounding features of calculating a span. For
example, setting the smallest unit (defaults to Unit::Nanosecond
), the
rounding mode (defaults to RoundMode::Trunc
) and the rounding increment
(defaults to 1
). The defaults are selected such that no rounding occurs.
Rounding a span as part of calculating it is provided as a convenience.
Callers may choose to round the span as a distinct step via
Span::round
.
§Example
This example shows how to round a span between two timestamps to the nearest half-hour, with ties breaking away from zero.
use jiff::{RoundMode, Timestamp, TimestampDifference, ToSpan, Unit};
let ts1 = "2024-03-15 08:14:00.123456789Z".parse::<Timestamp>()?;
let ts2 = "2024-03-22 15:00Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Minute)
.largest(Unit::Hour)
.mode(RoundMode::HalfExpand)
.increment(30),
)?;
assert_eq!(span, 175.hours());
// One less minute, and because of the HalfExpand mode, the span would
// get rounded down.
let ts2 = "2024-03-22 14:59Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Minute)
.largest(Unit::Hour)
.mode(RoundMode::HalfExpand)
.increment(30),
)?;
assert_eq!(span, 174.hours().minutes(30));
Implementations§
Source§impl TimestampDifference
impl TimestampDifference
Sourcepub fn new(timestamp: Timestamp) -> TimestampDifference
pub fn new(timestamp: Timestamp) -> TimestampDifference
Create a new default configuration for computing the span between
the given timestamp and some other time (specified as the receiver in
Timestamp::since
or Timestamp::until
).
Sourcepub fn smallest(self, unit: Unit) -> TimestampDifference
pub fn smallest(self, unit: Unit) -> TimestampDifference
Set the smallest units allowed in the span returned.
§Errors
The smallest units must be no greater than the largest units. If this is violated, then computing a span with this configuration will result in an error.
§Example
This shows how to round a span between two timestamps to units no less than seconds.
use jiff::{RoundMode, Timestamp, TimestampDifference, ToSpan, Unit};
let ts1 = "2024-03-15 08:14:02.5001Z".parse::<Timestamp>()?;
let ts2 = "2024-03-15T08:16:03.0001Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Second)
.mode(RoundMode::HalfExpand),
)?;
assert_eq!(span, 121.seconds());
// Because of the rounding mode, a small less-than-1-second increase in
// the first timestamp can change the result of rounding.
let ts1 = "2024-03-15 08:14:02.5002Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Second)
.mode(RoundMode::HalfExpand),
)?;
assert_eq!(span, 120.seconds());
Sourcepub fn largest(self, unit: Unit) -> TimestampDifference
pub fn largest(self, unit: Unit) -> TimestampDifference
Set the largest units allowed in the span returned.
When a largest unit is not specified, computing a span between
timestamps behaves as if it were set to Unit::Second
. Unless
TimestampDifference::smallest
is bigger than Unit::Second
, then
the largest unit is set to the smallest unit.
§Errors
The largest units, when set, must be at least as big as the smallest
units (which defaults to Unit::Nanosecond
). If this is violated,
then computing a span with this configuration will result in an error.
§Example
This shows how to round a span between two timestamps to units no bigger than seconds.
use jiff::{Timestamp, TimestampDifference, ToSpan, Unit};
let ts1 = "2024-03-15 08:14Z".parse::<Timestamp>()?;
let ts2 = "2030-11-22 08:30Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2).largest(Unit::Second),
)?;
assert_eq!(span, 211076160.seconds());
Sourcepub fn mode(self, mode: RoundMode) -> TimestampDifference
pub fn mode(self, mode: RoundMode) -> TimestampDifference
Set the rounding mode.
This defaults to RoundMode::Trunc
since it’s plausible that
rounding “up” in the context of computing the span between
two timestamps could be surprising in a number of cases. The
RoundMode::HalfExpand
mode corresponds to typical rounding you
might have learned about in school. But a variety of other rounding
modes exist.
§Example
This shows how to always round “up” towards positive infinity.
use jiff::{RoundMode, Timestamp, TimestampDifference, ToSpan, Unit};
let ts1 = "2024-03-15 08:10Z".parse::<Timestamp>()?;
let ts2 = "2024-03-15 08:11Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Hour)
.mode(RoundMode::Ceil),
)?;
// Only one minute elapsed, but we asked to always round up!
assert_eq!(span, 1.hour());
// Since `Ceil` always rounds toward positive infinity, the behavior
// flips for a negative span.
let span = ts1.since(
TimestampDifference::new(ts2)
.smallest(Unit::Hour)
.mode(RoundMode::Ceil),
)?;
assert_eq!(span, 0.hour());
Sourcepub fn increment(self, increment: i64) -> TimestampDifference
pub fn increment(self, increment: i64) -> TimestampDifference
Set the rounding increment for the smallest unit.
The default value is 1
. Other values permit rounding the smallest
unit to the nearest integer increment specified. For example, if the
smallest unit is set to Unit::Minute
, then a rounding increment of
30
would result in rounding in increments of a half hour. That is,
the only minute value that could result would be 0
or 30
.
§Errors
The rounding increment must divide evenly into the next highest unit
after the smallest unit configured (and must not be equivalent to it).
For example, if the smallest unit is Unit::Nanosecond
, then some
of the valid values for the rounding increment are 1
, 2
, 4
, 5
,
100
and 500
. Namely, any integer that divides evenly into 1,000
nanoseconds since there are 1,000
nanoseconds in the next highest
unit (microseconds).
The error will occur when computing the span, and not when setting the increment here.
§Example
This shows how to round the span between two timestamps to the nearest 5 minute increment.
use jiff::{RoundMode, Timestamp, TimestampDifference, ToSpan, Unit};
let ts1 = "2024-03-15 08:19Z".parse::<Timestamp>()?;
let ts2 = "2024-03-15 12:52Z".parse::<Timestamp>()?;
let span = ts1.until(
TimestampDifference::new(ts2)
.smallest(Unit::Minute)
.increment(5)
.mode(RoundMode::HalfExpand),
)?;
assert_eq!(span, 275.minutes());
Trait Implementations§
Source§impl Clone for TimestampDifference
impl Clone for TimestampDifference
Source§fn clone(&self) -> TimestampDifference
fn clone(&self) -> TimestampDifference
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for TimestampDifference
impl Debug for TimestampDifference
Source§impl<'a> From<&'a Zoned> for TimestampDifference
impl<'a> From<&'a Zoned> for TimestampDifference
Source§fn from(zdt: &'a Zoned) -> TimestampDifference
fn from(zdt: &'a Zoned) -> TimestampDifference
Source§impl From<Timestamp> for TimestampDifference
impl From<Timestamp> for TimestampDifference
Source§fn from(ts: Timestamp) -> TimestampDifference
fn from(ts: Timestamp) -> TimestampDifference
Source§impl From<Zoned> for TimestampDifference
impl From<Zoned> for TimestampDifference
Source§fn from(zdt: Zoned) -> TimestampDifference
fn from(zdt: Zoned) -> TimestampDifference
impl Copy for TimestampDifference
Auto Trait Implementations§
impl Freeze for TimestampDifference
impl RefUnwindSafe for TimestampDifference
impl Send for TimestampDifference
impl Sync for TimestampDifference
impl Unpin for TimestampDifference
impl UnwindSafe for TimestampDifference
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)