Enum PiecesOffset
#[non_exhaustive]pub enum PiecesOffset {
Zulu,
Numeric(PiecesNumericOffset),
}
dep_jiff
and alloc
only.Expand description
An offset parsed from a Temporal ISO 8601 datetime string, for use with
Pieces
.
One can almost think of this as effectively equivalent to an Offset
. And
indeed, all PiecesOffset
values can be convert to an Offset
. However,
some offsets in a datetime string have a different connotation that can’t
be captured by an Offset
.
For example, the offsets Z
, -00:00
and +00:00
all map to
Offset::UTC
after parsing. However, Z
and -00:00
generally
indicate that the offset from local time is unknown, where as +00:00
indicates that the offset from local is known and is zero. This type
permits callers to inspect what offset was actually written.
§Example
This example shows how one can create Temporal ISO 8601 datetime strings
with +00:00
, -00:00
or Z
offsets.
use jiff::{
fmt::temporal::{Pieces, PiecesNumericOffset},
tz::Offset,
Timestamp,
};
// If you create a `Pieces` from a `Timestamp` with a UTC offset,
// then this is interpreted as "the offset from UTC is known and is
// zero."
let pieces = Pieces::from((Timestamp::UNIX_EPOCH, Offset::UTC));
assert_eq!(pieces.to_string(), "1970-01-01T00:00:00+00:00");
// Otherwise, if you create a `Pieces` from just a `Timestamp` with
// no offset, then it is interpreted as "the offset from UTC is not
// known." Typically, this is rendered with `Z` for "Zulu":
let pieces = Pieces::from(Timestamp::UNIX_EPOCH);
assert_eq!(pieces.to_string(), "1970-01-01T00:00:00Z");
// But it might be the case that you want to use `-00:00` instead,
// perhaps to conform to some existing convention or legacy
// applications that require it:
let pieces = Pieces::from(Timestamp::UNIX_EPOCH)
.with_offset(
PiecesNumericOffset::from(Offset::UTC).with_negative_zero(),
);
assert_eq!(pieces.to_string(), "1970-01-01T00:00:00-00:00");
Without Pieces
, it’s not otherwise possible to emit a -00:00
offset.
For example,
DateTimePrinter::print_timestamp
will always emit Z
, which is consider semantically identical to -00:00
by RFC 9557. There’s no specific use case where it’s expected that you
should need to write -00:00
instead of Z
, but it’s conceivable legacy
or otherwise inflexible applications might want it. Or perhaps, in some
systems, there is a distinction to draw between Z
and -00:00
.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Zulu
The “Zulu” offset, corresponding to UTC in a context where the offset for civil time is unknown or unavailable.
RFC 9557 defines this as equivalent in semantic meaning to -00:00
:
If the time in UTC is known, but the offset to local time is unknown, this can be represented with an offset of
Z
. (The original version of this specification provided-00:00
for this purpose, which is not allowed by ISO-8601:2000 and therefore is less interoperable; Section 3.3 of RFC 5322 describes a related convention for email, which does not have this problem). This differs semantically from an offset of+00:00
, which implies that UTC is the preferred reference point for the specified time.
Numeric(PiecesNumericOffset)
A specific numeric offset, including whether the parsed sign is negative.
The sign is usually redundant, since an Offset
is itself signed. But
it can be used to distinguish between +00:00
(+00
is the preferred
offset) and -00:00
(+00
is what should be used, but only because
the offset to local time is not known). Generally speaking, one should
regard -00:00
as equivalent to Z
, per RFC 9557.
Implementations§
§impl PiecesOffset
impl PiecesOffset
pub fn to_numeric_offset(&self) -> Offset
pub fn to_numeric_offset(&self) -> Offset
Converts this offset to a concrete numeric offset in all cases.
If this was a Z
or a -00:00
offset, then Offset::UTC
is returned.
In all other cases, the underlying numeric offset is returned as-is.
§Example
use jiff::{
fmt::temporal::{Pieces, PiecesNumericOffset, PiecesOffset},
tz::Offset,
};
let pieces = Pieces::parse("1970-01-01T00:00:00Z")?;
let off = pieces.offset().unwrap();
// Parsed as Zulu.
assert_eq!(off, PiecesOffset::Zulu);
// Gets converted from Zulu to UTC, i.e., just zero.
assert_eq!(off.to_numeric_offset(), Offset::UTC);
let pieces = Pieces::parse("1970-01-01T00:00:00-00:00")?;
let off = pieces.offset().unwrap();
// Parsed as a negative zero.
assert_eq!(off, PiecesOffset::from(
PiecesNumericOffset::from(Offset::UTC).with_negative_zero(),
));
// Gets converted from -00:00 to UTC, i.e., just zero.
assert_eq!(off.to_numeric_offset(), Offset::UTC);
let pieces = Pieces::parse("1970-01-01T00:00:00+00:00")?;
let off = pieces.offset().unwrap();
// Parsed as a positive zero.
assert_eq!(off, PiecesOffset::from(
PiecesNumericOffset::from(Offset::UTC),
));
// Gets converted from -00:00 to UTC, i.e., just zero.
assert_eq!(off.to_numeric_offset(), Offset::UTC);
Trait Implementations§
§impl Clone for PiecesOffset
impl Clone for PiecesOffset
§fn clone(&self) -> PiecesOffset
fn clone(&self) -> PiecesOffset
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more§impl Debug for PiecesOffset
impl Debug for PiecesOffset
§impl From<Offset> for PiecesOffset
impl From<Offset> for PiecesOffset
§fn from(offset: Offset) -> PiecesOffset
fn from(offset: Offset) -> PiecesOffset
§impl From<PiecesNumericOffset> for PiecesOffset
impl From<PiecesNumericOffset> for PiecesOffset
§fn from(offset: PiecesNumericOffset) -> PiecesOffset
fn from(offset: PiecesNumericOffset) -> PiecesOffset
§impl Hash for PiecesOffset
impl Hash for PiecesOffset
§impl PartialEq for PiecesOffset
impl PartialEq for PiecesOffset
impl Copy for PiecesOffset
impl Eq for PiecesOffset
impl StructuralPartialEq for PiecesOffset
Auto Trait Implementations§
impl Freeze for PiecesOffset
impl RefUnwindSafe for PiecesOffset
impl Send for PiecesOffset
impl Sync for PiecesOffset
impl Unpin for PiecesOffset
impl UnwindSafe for PiecesOffset
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,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.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.