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.
§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.
§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.
§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.
§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§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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 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_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> 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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.