#[non_exhaustive]pub enum PiecesOffset {
Zulu,
Numeric(PiecesNumericOffset),
}
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§
Source§impl PiecesOffset
impl PiecesOffset
Sourcepub 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§
Source§impl Clone for PiecesOffset
impl Clone for PiecesOffset
Source§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 moreSource§impl Debug for PiecesOffset
impl Debug for PiecesOffset
Source§impl From<Offset> for PiecesOffset
impl From<Offset> for PiecesOffset
Source§fn from(offset: Offset) -> PiecesOffset
fn from(offset: Offset) -> PiecesOffset
Source§impl From<PiecesNumericOffset> for PiecesOffset
impl From<PiecesNumericOffset> for PiecesOffset
Source§fn from(offset: PiecesNumericOffset) -> PiecesOffset
fn from(offset: PiecesNumericOffset) -> PiecesOffset
Source§impl Hash for PiecesOffset
impl Hash for PiecesOffset
Source§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§
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§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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