devela::_dep::jiff::tz

Struct TimeZoneDatabase

pub struct TimeZoneDatabase { /* private fields */ }
Available on crate features dep_jiff and alloc only.
Expand description

A handle to a IANA Time Zone Database.

A TimeZoneDatabase provides a way to lookup TimeZones by their human readable identifiers, such as America/Los_Angeles and Europe/Warsaw.

It is rare to need to create or use this type directly. Routines like zoned datetime parsing and time zone conversion provide convenience routines for using an implicit global time zone database by default. This global time zone database is available via jiff::tz::db. But lower level parsing routines such as fmt::temporal::DateTimeParser::parse_zoned_with and civil::DateTime::to_zoned provide a means to use a custom copy of a TimeZoneDatabase.

§Platform behavior

This behavior is subject to change.

On Unix systems, and when the tzdb-zoneinfo crate feature is enabled (which it is by default), Jiff will read the /usr/share/zoneinfo directory for time zone data.

On Windows systems and when the tzdb-bundle-platform crate feature is enabled (which it is by default), or when the tzdb-bundle-always crate feature is enabled, then the jiff-tzdb crate will be used to embed the entire Time Zone Database into the compiled artifact.

In general, using /usr/share/zoneinfo (or an equivalent) is heavily preferred in lieu of embedding the database into your compiled artifact. The reason is because your system copy of the Time Zone Database may be updated, perhaps a few times a year, and it is better to get seamless updates through your system rather than needing to wait on a Rust crate to update and then rebuild your software. The bundling approach should only be used when there is no plausible alternative. For example, Windows has no canonical location for a copy of the Time Zone Database. Indeed, this is why the Cargo configuration of Jiff specifically does not enabled bundling by default on Unix systems, but does enable it by default on Windows systems. Of course, if you really do need a copy of the database bundled, then you can enable the tzdb-bundle-always crate feature.

§Cloning

A TimeZoneDatabase can be cheaply cloned. It will share a thread safe cache with other copies of the same TimeZoneDatabase.

§Caching

Because looking up a time zone on disk, reading the file into memory and parsing the time zone transitions out of that file requires a fair amount of work, a TimeZoneDatabase does a fair bit of caching. This means that the vast majority of calls to, for example, Timestamp::intz don’t actually need to hit disk. It will just find a cached copy of a TimeZone and return that.

Of course, with caching comes problems of cache invalidation. Invariably, there are parameters that Jiff uses to manage when the cache should be invalidated. Jiff tries to emit log messages about this when it happens. If you find the caching behavior of Jiff to be sub-optimal for your use case, please create an issue. (The plan is likely to expose some options for configuring the behavior of a TimeZoneDatabase, but I wanted to collect user feedback first.)

§Example: list all available time zones

use jiff::tz;

for tzid in tz::db().available() {
    println!("{tzid}");
}

§Example: using multiple time zone databases

Jiff supports opening and using multiple time zone databases by default. All you need to do is point TimeZoneDatabase::from_dir to your own copy of the Time Zone Database, and it will handle the rest.

This example shows how to utilize multiple databases by parsing a datetime using an older copy of the IANA Time Zone Database. This example leverages the fact that the 2018 copy of the database preceded Brazil’s announcement that daylight saving time would be abolished. This meant that datetimes in the future, when parsed with the older copy of the Time Zone Database, would still follow the old daylight saving time rules. But a mere update of the database would otherwise change the meaning of the datetime.

This scenario can come up if one stores datetimes in the future. This is also why the default offset conflict resolution strategy when parsing zoned datetimes is OffsetConflict::Reject, which prevents one from silently re-interpreting datetimes to a different timestamp.

use jiff::{fmt::temporal::DateTimeParser, tz::{self, TimeZoneDatabase}};

static PARSER: DateTimeParser = DateTimeParser::new();

// Open a version of tzdb from before Brazil announced its abolition
// of daylight saving time.
let tzdb2018 = TimeZoneDatabase::from_dir("path/to/tzdb-2018b")?;
// Open the system tzdb.
let tzdb = tz::db();

// Parse the same datetime string with the same parser, but using two
// different versions of tzdb.
let dt = "2020-01-15T12:00[America/Sao_Paulo]";
let zdt2018 = PARSER.parse_zoned_with(&tzdb2018, dt)?;
let zdt = PARSER.parse_zoned_with(tzdb, dt)?;

// Before DST was abolished, 2020-01-15 was in DST, which corresponded
// to UTC offset -02. Since DST rules applied to datetimes in the
// future, the 2018 version of tzdb would lead one to interpret
// 2020-01-15 as being in DST.
assert_eq!(zdt2018.offset(), tz::offset(-2));
// But DST was abolished in 2019, which means that 2020-01-15 was no
// no longer in DST. So after a tzdb update, the same datetime as above
// now has a different offset.
assert_eq!(zdt.offset(), tz::offset(-3));

// So if you try to parse a datetime serialized from an older copy of
// tzdb, you'll get an error under the default configuration because
// of `OffsetConflict::Reject`. This would succeed if you parsed it
// using tzdb2018!
assert!(PARSER.parse_zoned_with(tzdb, zdt2018.to_string()).is_err());

Implementations§

§

impl TimeZoneDatabase

pub const fn none() -> TimeZoneDatabase

Returns a database for which all time zone lookups fail.

§Example
use jiff::tz::TimeZoneDatabase;

let db = TimeZoneDatabase::none();
assert_eq!(db.available().count(), 0);

pub fn from_env() -> TimeZoneDatabase

Returns a time zone database initialized from the current environment.

This routine never fails, but it may not be able to find a copy of your Time Zone Database. When this happens, log messages (with some at least at the WARN level) will be emitted. They can be viewed by installing a log compatible logger such as env_logger.

Typically, one does not need to call this routine directly. Instead, it’s done for you as part of jiff::tz::db. This does require Jiff’s std feature to be enabled though. So for example, you might use this constructor when the features alloc and tzdb-bundle-always are enabled to get access to a bundled copy of the IANA time zone database. (Accessing the system copy at /usr/share/zoneinfo requires std.)

Beware that calling this constructor will create a new distinct handle from the one returned by jiff::tz::db with its own cache.

§Platform behavior

When the TZDIR environment variable is set, this will attempt to open the Time Zone Database at the directory specified. Otherwise, this will search a list of predefined directories for a system installation of the Time Zone Database. Typically, it’s found at /usr/share/zoneinfo.

On Windows systems, under the default crate configuration, this will return an embedded copy of the Time Zone Database since Windows does not have a canonical installation of the Time Zone Database.

pub fn from_dir<P>(path: P) -> Result<TimeZoneDatabase, Error>
where P: AsRef<Path>,

Returns a time zone database initialized from the given directory.

Unlike TimeZoneDatabase::from_env, this always attempts to look for a copy of the Time Zone Database at the directory given. And if it fails to find one at that directory, then an error is returned.

Basically, you should use this when you need to use a specific copy of the Time Zone Database, and use TimeZoneDatabase::from_env when you just want Jiff to try and “do the right thing for you.”

§Errors

This returns an error if the given directory does not contain a valid copy of the Time Zone Database. Generally, this means a directory with at least one valid TZif file.

pub fn from_concatenated_path<P>(path: P) -> Result<TimeZoneDatabase, Error>
where P: AsRef<Path>,

Returns a time zone database initialized from a path pointing to a concatenated tzdata file. This type of format is only known to be found on Android environments. The specific format for this file isn’t defined formally anywhere, but Jiff parses the same format supported by the Android Platform.

Unlike TimeZoneDatabase::from_env, this always attempts to look for a copy of the Time Zone Database at the path given. And if it fails to find one at that path, then an error is returned.

Basically, you should use this when you need to use a specific copy of the Time Zone Database in its concatenated format, and use TimeZoneDatabase::from_env when you just want Jiff to try and “do the right thing for you.” (TimeZoneDatabase::from_env will attempt to automatically detect the presence of a system concatenated tzdata file on Android.)

§Errors

This returns an error if the given path does not contain a valid copy of the concatenated Time Zone Database.

pub fn get(&self, name: &str) -> Result<TimeZone, Error>

Returns a TimeZone corresponding to the IANA time zone identifier given.

The lookup is performed without regard to ASCII case.

To see a list of all available time zone identifiers for this database, use TimeZoneDatabase::available.

§Example
use jiff::tz;

let tz = tz::db().get("america/NEW_YORK")?;
assert_eq!(tz.iana_name(), Some("America/New_York"));

pub fn available(&self) -> TimeZoneNameIter

Returns a list of all available time zone identifiers from this database.

Note that time zone identifiers are more of a machine readable abstraction and not an end user level abstraction. Still, users comfortable with configuring their system’s default time zone through IANA time zone identifiers are probably comfortable interacting with the identifiers returned here.

§Example
use jiff::tz;

for tzid in tz::db().available() {
    println!("{tzid}");
}

pub fn reset(&self)

Resets the internal cache of this database.

Subsequent interactions with this database will need to re-read time zone data from disk.

It might be useful to call this if you know the time zone database has changed on disk and want to force Jiff to re-load it immediately without spawning a new process or waiting for Jiff’s internal cache invalidation heuristics to kick in.

pub fn is_definitively_empty(&self) -> bool

Returns true if it is known that this time zone database is empty.

When this returns true, it is guaranteed that all TimeZoneDatabase::get calls will fail, and that TimeZoneDatabase::available will always return an empty iterator.

Note that if this returns false, it is still possible for this database to be empty.

§Example
use jiff::tz::TimeZoneDatabase;

let db = TimeZoneDatabase::none();
assert!(db.is_definitively_empty());

Trait Implementations§

§

impl Clone for TimeZoneDatabase

§

fn clone(&self) -> TimeZoneDatabase

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for TimeZoneDatabase

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByteSized for T

Source§

const BYTE_ALIGN: usize = _

The alignment of this type in bytes.
Source§

const BYTE_SIZE: usize = _

The size of this type in bytes.
Source§

fn byte_align(&self) -> usize

Returns the alignment of this type in bytes.
Source§

fn byte_size(&self) -> usize

Returns the size of this type in bytes. Read more
Source§

fn ptr_size_ratio(&self) -> [usize; 2]

Returns the size ratio between Ptr::BYTES and BYTE_SIZE. Read more
Source§

impl<T, R> Chain<R> for T
where T: ?Sized,

Source§

fn chain<F>(self, f: F) -> R
where F: FnOnce(Self) -> R, Self: Sized,

Chain a function which takes the parameter by value.
Source§

fn chain_ref<F>(&self, f: F) -> R
where F: FnOnce(&Self) -> R,

Chain a function which takes the parameter by shared reference.
Source§

fn chain_mut<F>(&mut self, f: F) -> R
where F: FnOnce(&mut Self) -> R,

Chain a function which takes the parameter by exclusive reference.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> ExtAny for T
where T: Any + ?Sized,

Source§

fn type_id() -> TypeId

Returns the TypeId of Self. Read more
Source§

fn type_of(&self) -> TypeId

Returns the TypeId of self. Read more
Source§

fn type_name(&self) -> &'static str

Returns the type name of self. Read more
Source§

fn type_is<T: 'static>(&self) -> bool

Returns true if Self is of type T. Read more
Source§

fn as_any_ref(&self) -> &dyn Any
where Self: Sized,

Upcasts &self as &dyn Any. Read more
Source§

fn as_any_mut(&mut self) -> &mut dyn Any
where Self: Sized,

Upcasts &mut self as &mut dyn Any. Read more
Source§

fn as_any_box(self: Box<Self>) -> Box<dyn Any>
where Self: Sized,

Upcasts Box<self> as Box<dyn Any>. Read more
Source§

fn downcast_ref<T: 'static>(&self) -> Option<&T>

Available on crate feature unsafe_layout only.
Returns some shared reference to the inner value if it is of type T. Read more
Source§

fn downcast_mut<T: 'static>(&mut self) -> Option<&mut T>

Available on crate feature unsafe_layout only.
Returns some exclusive reference to the inner value if it is of type T. Read more
Source§

impl<T> ExtMem for T
where T: ?Sized,

Source§

const NEEDS_DROP: bool = _

Know whether dropping values of this type matters, in compile-time.
Source§

fn mem_align_of<T>() -> usize

Returns the minimum alignment of the type in bytes. Read more
Source§

fn mem_align_of_val(&self) -> usize

Returns the alignment of the pointed-to value in bytes. Read more
Source§

fn mem_size_of<T>() -> usize

Returns the size of a type in bytes. Read more
Source§

fn mem_size_of_val(&self) -> usize

Returns the size of the pointed-to value in bytes. Read more
Source§

fn mem_copy(&self) -> Self
where Self: Copy,

Bitwise-copies a value. Read more
Source§

fn mem_needs_drop(&self) -> bool

Returns true if dropping values of this type matters. Read more
Source§

fn mem_drop(self)
where Self: Sized,

Drops self by running its destructor. Read more
Source§

fn mem_forget(self)
where Self: Sized,

Forgets about self without running its destructor. Read more
Source§

fn mem_replace(&mut self, other: Self) -> Self
where Self: Sized,

Replaces self with other, returning the previous value of self. Read more
Source§

fn mem_take(&mut self) -> Self
where Self: Default,

Replaces self with its default value, returning the previous value of self. Read more
Source§

fn mem_swap(&mut self, other: &mut Self)
where Self: Sized,

Swaps the value of self and other without deinitializing either one. Read more
Source§

unsafe fn mem_zeroed<T>() -> T

Available on crate feature unsafe_layout only.
Returns the value of type T represented by the all-zero byte-pattern. Read more
Source§

unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst

Available on crate feature unsafe_layout only.
Returns the value of type T represented by the all-zero byte-pattern. Read more
Source§

fn mem_as_bytes(&self) -> &[u8]
where Self: Sync + Unpin,

Available on crate feature unsafe_slice only.
View a Sync + Unpin self as &[u8]. Read more
Source§

fn mem_as_bytes_mut(&mut self) -> &mut [u8]
where Self: Sync + Unpin,

Available on crate feature unsafe_slice only.
View a Sync + Unpin self as &mut [u8]. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

Source§

impl<T> Hook for T

Source§

fn hook_ref<F>(self, f: F) -> Self
where F: FnOnce(&Self),

Applies a function which takes the parameter by shared reference, and then returns the (possibly) modified owned value. Read more
Source§

fn hook_mut<F>(self, f: F) -> Self
where F: FnOnce(&mut Self),

Applies a function which takes the parameter by exclusive reference, and then returns the (possibly) modified owned value. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 F
where T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

impl<T> Ungil for T
where T: Send,