pub enum AmbiguousOffset {
Unambiguous {
offset: Offset,
},
Gap {
before: Offset,
after: Offset,
},
Fold {
before: Offset,
after: Offset,
},
}
Expand description
A possibly ambiguous Offset
.
An AmbiguousOffset
is part of both AmbiguousTimestamp
and
AmbiguousZoned
, which are created by
TimeZone::to_ambiguous_timestamp
and
TimeZone::to_ambiguous_zoned
, respectively.
When converting a civil datetime in a particular time zone to a precise
instant in time (that is, either Timestamp
or Zoned
), then the primary
thing needed to form a precise instant in time is an Offset
. The
problem is that some civil datetimes are ambiguous. That is, some do not
exist (because they fall into a gap, where some civil time is skipped),
or some are repeated (because they fall into a fold, where some civil time
is repeated).
The purpose of this type is to represent that ambiguity when it occurs. The ambiguity is manifest through the offset choice: it is either the offset before the transition or the offset after the transition. This is true regardless of whether the ambiguity occurs as a result of a gap or a fold.
It is generally considered very rare to need to inspect values of this
type directly. Instead, higher level routines like
AmbiguousZoned::compatible
or AmbiguousZoned::unambiguous
will
implement a strategy for you.
§Example
This example shows how the “compatible” disambiguation strategy is implemented. Recall that the “compatible” strategy chooses the offset corresponding to the civil datetime after a gap, and the offset corresponding to the civil datetime before a gap.
use jiff::{civil::date, tz::{self, AmbiguousOffset}};
let tz = tz::db().get("America/New_York")?;
let dt = date(2024, 3, 10).at(2, 30, 0, 0);
let offset = match tz.to_ambiguous_timestamp(dt).offset() {
AmbiguousOffset::Unambiguous { offset } => offset,
// This is counter-intuitive, but in order to get the civil datetime
// *after* the gap, we need to select the offset from *before* the
// gap.
AmbiguousOffset::Gap { before, .. } => before,
AmbiguousOffset::Fold { before, .. } => before,
};
assert_eq!(offset.to_timestamp(dt)?.to_string(), "2024-03-10T07:30:00Z");
Variants§
Unambiguous
The offset for a particular civil datetime and time zone is unambiguous.
This is the overwhelmingly common case. In general, the only time this case does not occur is when there is a transition to a different time zone (rare) or to/from daylight saving time (occurs for 1 hour twice in year in many geographic locations).
Fields
Gap
The offset for a particular civil datetime and time zone is ambiguous because there is a gap.
This most commonly occurs when a civil datetime corresponds to an hour that was “skipped” in a jump to DST (daylight saving time).
Fields
Fold
The offset for a particular civil datetime and time zone is ambiguous because there is a fold.
This most commonly occurs when a civil datetime corresponds to an hour that was “repeated” in a jump to standard time from DST (daylight saving time).
Trait Implementations§
Source§impl Clone for AmbiguousOffset
impl Clone for AmbiguousOffset
Source§fn clone(&self) -> AmbiguousOffset
fn clone(&self) -> AmbiguousOffset
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for AmbiguousOffset
impl Debug for AmbiguousOffset
Source§impl PartialEq for AmbiguousOffset
impl PartialEq for AmbiguousOffset
impl Copy for AmbiguousOffset
impl Eq for AmbiguousOffset
impl StructuralPartialEq for AmbiguousOffset
Auto Trait Implementations§
impl Freeze for AmbiguousOffset
impl RefUnwindSafe for AmbiguousOffset
impl Send for AmbiguousOffset
impl Sync for AmbiguousOffset
impl Unpin for AmbiguousOffset
impl UnwindSafe for AmbiguousOffset
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