Struct TimeWith
pub struct TimeWith { /* private fields */ }dep_jiff and alloc only.Expand description
A builder for setting the fields on a Time.
This builder is constructed via Time::with.
§Example
Unlike Date, a Time is valid for all possible valid values of its
fields. That is, there is no way for two valid field values to combine
into an invalid Time. So, for Time, this builder does have as much of
a benefit versus an API design with methods like Time::with_hour and
Time::with_minute. Nevertheless, this builder permits settings multiple
fields at the same time and performing only one validity check. Moreover,
this provides a consistent API with other date and time types in this
crate.
use jiff::civil::time;
let t1 = time(0, 0, 24, 0);
let t2 = t1.with().hour(15).minute(30).millisecond(10).build()?;
assert_eq!(t2, time(15, 30, 24, 10_000_000));
Implementations§
§impl TimeWith
impl TimeWith
pub fn build(self) -> Result<Time, Error> ⓘ
pub fn build(self) -> Result<Time, Error> ⓘ
Create a new Time from the fields set on this configuration.
An error occurs when the fields combine to an invalid time. This only
occurs when at least one field has an invalid value, or if at least
one of millisecond, microsecond or nanosecond is set and
subsec_nanosecond is set. Otherwise, if all fields are valid, then
the entire Time is guaranteed to be valid.
For any fields not set on this configuration, the values are taken from
the Time that originally created this configuration. When no values
are set, this routine is guaranteed to succeed and will always return
the original time without modification.
§Example
This creates a time but with its fractional nanosecond component stripped:
use jiff::civil::time;
let t = time(14, 27, 30, 123_456_789);
assert_eq!(t.with().subsec_nanosecond(0).build()?, time(14, 27, 30, 0));
§Example: error for invalid time
use jiff::civil::time;
let t = time(14, 27, 30, 0);
assert!(t.with().hour(24).build().is_err());§Example: error for ambiguous sub-second value
use jiff::civil::time;
let t = time(14, 27, 30, 123_456_789);
// Setting both the individual sub-second fields and the entire
// fractional component could lead to a misleading configuration. So
// if it's done, it results in an error in all cases. Callers must
// choose one or the other.
assert!(t.with().microsecond(1).subsec_nanosecond(0).build().is_err());pub fn hour(self, hour: i8) -> TimeWith
pub fn hour(self, hour: i8) -> TimeWith
Set the hour field on a Time.
One can access this value via Time::hour.
This overrides any previous hour settings.
§Errors
This returns an error when TimeWith::build is called if the given
hour is outside the range 0..=23.
§Example
use jiff::civil::time;
let t1 = time(15, 21, 59, 0);
assert_eq!(t1.hour(), 15);
let t2 = t1.with().hour(3).build()?;
assert_eq!(t2.hour(), 3);
pub fn minute(self, minute: i8) -> TimeWith
pub fn minute(self, minute: i8) -> TimeWith
Set the minute field on a Time.
One can access this value via Time::minute.
This overrides any previous minute settings.
§Errors
This returns an error when TimeWith::build is called if the given
minute is outside the range 0..=59.
§Example
use jiff::civil::time;
let t1 = time(15, 21, 59, 0);
assert_eq!(t1.minute(), 21);
let t2 = t1.with().minute(3).build()?;
assert_eq!(t2.minute(), 3);
pub fn second(self, second: i8) -> TimeWith
pub fn second(self, second: i8) -> TimeWith
Set the second field on a Time.
One can access this value via Time::second.
This overrides any previous second settings.
§Errors
This returns an error when TimeWith::build is called if the given
second is outside the range 0..=59.
§Example
use jiff::civil::time;
let t1 = time(15, 21, 59, 0);
assert_eq!(t1.second(), 59);
let t2 = t1.with().second(3).build()?;
assert_eq!(t2.second(), 3);
pub fn millisecond(self, millisecond: i16) -> TimeWith
pub fn millisecond(self, millisecond: i16) -> TimeWith
Set the millisecond field on a Time.
One can access this value via Time::millisecond.
This overrides any previous millisecond settings.
Note that this only sets the millisecond component. It does
not change the microsecond or nanosecond components. To set
the fractional second component to nanosecond precision, use
TimeWith::subsec_nanosecond.
§Errors
This returns an error when TimeWith::build is called if the given
millisecond is outside the range 0..=999, or if both this and
TimeWith::subsec_nanosecond are set.
§Example
This shows the relationship between Time::millisecond and
Time::subsec_nanosecond:
use jiff::civil::time;
let t = time(15, 21, 35, 0).with().millisecond(123).build()?;
assert_eq!(t.subsec_nanosecond(), 123_000_000);
pub fn microsecond(self, microsecond: i16) -> TimeWith
pub fn microsecond(self, microsecond: i16) -> TimeWith
Set the microsecond field on a Time.
One can access this value via Time::microsecond.
This overrides any previous microsecond settings.
Note that this only sets the microsecond component. It does
not change the millisecond or nanosecond components. To set
the fractional second component to nanosecond precision, use
TimeWith::subsec_nanosecond.
§Errors
This returns an error when TimeWith::build is called if the given
microsecond is outside the range 0..=999, or if both this and
TimeWith::subsec_nanosecond are set.
§Example
This shows the relationship between Time::microsecond and
Time::subsec_nanosecond:
use jiff::civil::time;
let t = time(15, 21, 35, 0).with().microsecond(123).build()?;
assert_eq!(t.subsec_nanosecond(), 123_000);
pub fn nanosecond(self, nanosecond: i16) -> TimeWith
pub fn nanosecond(self, nanosecond: i16) -> TimeWith
Set the nanosecond field on a Time.
One can access this value via Time::nanosecond.
This overrides any previous nanosecond settings.
Note that this only sets the nanosecond component. It does
not change the millisecond or microsecond components. To set
the fractional second component to nanosecond precision, use
TimeWith::subsec_nanosecond.
§Errors
This returns an error when TimeWith::build is called if the given
nanosecond is outside the range 0..=999, or if both this and
TimeWith::subsec_nanosecond are set.
§Example
This shows the relationship between Time::nanosecond and
Time::subsec_nanosecond:
use jiff::civil::time;
let t = time(15, 21, 35, 0).with().nanosecond(123).build()?;
assert_eq!(t.subsec_nanosecond(), 123);
pub fn subsec_nanosecond(self, subsec_nanosecond: i32) -> TimeWith
pub fn subsec_nanosecond(self, subsec_nanosecond: i32) -> TimeWith
Set the subsecond nanosecond field on a Time.
If you want to access this value on Time, then use
Time::subsec_nanosecond.
This overrides any previous subsecond nanosecond settings.
Note that this sets the entire fractional second component to
nanosecond precision, and overrides any individual millisecond,
microsecond or nanosecond settings. To set individual components,
use TimeWith::millisecond, TimeWith::microsecond or
TimeWith::nanosecond.
§Errors
This returns an error when TimeWith::build is called if the given
subsecond nanosecond is outside the range 0..=999,999,999, or if both
this and one of TimeWith::millisecond, TimeWith::microsecond or
TimeWith::nanosecond are set.
§Example
This shows the relationship between constructing a Time value with
subsecond nanoseconds and its individual subsecond fields:
use jiff::civil::time;
let t1 = time(15, 21, 35, 0);
let t2 = t1.with().subsec_nanosecond(123_456_789).build()?;
assert_eq!(t2.millisecond(), 123);
assert_eq!(t2.microsecond(), 456);
assert_eq!(t2.nanosecond(), 789);
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TimeWith
impl RefUnwindSafe for TimeWith
impl Send for TimeWith
impl Sync for TimeWith
impl Unpin for TimeWith
impl UnwindSafe for TimeWith
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> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize
fn byte_align(&self) -> usize
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
TypeId of Self using a custom hasher.Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of<T>() -> usize
fn mem_align_of<T>() -> usize
Source§fn mem_align_of_val(&self) -> usize
fn mem_align_of_val(&self) -> usize
Source§fn mem_size_of<T>() -> usize
fn mem_size_of<T>() -> usize
Source§fn mem_size_of_val(&self) -> usize
fn mem_size_of_val(&self) -> usize
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more