[go: up one dir, main page]

tzfile 0.1.3

chrono::TimeZone implementation using system tz database
Documentation
tzfile
======

[![Crates.io](https://img.shields.io/crates/v/tzfile.svg)](https://crates.io/crates/tzfile)
[![docs.rs](https://docs.rs/tzfile/badge.svg)](https://docs.rs/tzfile)
[![Build status](https://github.com/kennytm/tzfile/workflows/Rust/badge.svg)](https://github.com/kennytm/tzfile/actions?query=workflow%3ARust)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.txt)

`tzfile` is a `chrono::TimeZone` implementation using the system [tz database].
It can parse compiled (binary) time zone files inside `/usr/share/zoneinfo` into
time zone objects for [`chrono`].

[tz database]: https://en.wikipedia.org/wiki/Tz_database
[`chrono`]: https://github.com/chronotope/chrono

```rust
use chrono::{Utc, TimeZone};
use tzfile::Tz;

let tz = Tz::named("America/New_York")?;
let dt1 = Utc.ymd(2019, 3, 10).and_hms(6, 45, 0);
assert_eq!(dt1.with_timezone(&&tz).to_string(), "2019-03-10 01:45:00 EST");
let dt2 = Utc.ymd(2019, 3, 10).and_hms(7, 15, 0);
assert_eq!(dt2.with_timezone(&&tz).to_string(), "2019-03-10 03:15:00 EDT");
```

## `tzfile` vs `chrono-tz`

`tzfile` loads the time zone information dynamically from the OS, while
`chrono-tz` pins to a particular version of tz database and embeds the parsed
result statically in the resulting executable.

Users of `tzfile` can get the same time zone configuration as the system, and
guarantees the same behavior with other non-Rust programs. However, some systems
do not provide a complete tz database (e.g. Windows), making the program not
portable across multiple platforms.

## Performance

Conversion from UTC to local has comparable performance with `chrono-tz` as both
uses the same data structure (sorted array). In the reverse direction (local to
UTC), `tzfile` caches the conversion table, allowing to be faster than
`chrono-tz` in all cases.

| Time zone type  | Asia/Tehran → UTC | UTC → Asia/Tehran |
|-----------------|------------------:|------------------:|
| `&tzfile::Tz`   | 107 ns            | 33 ns             |
| `tzfile::RcTz`  | 125 ns            | 38 ns             |
| `tzfile::ArcTz` | 156 ns            | 48 ns             |
| `chrono_tz::Tz` | 227 ns            | 43 ns             |

Note: parsing the tz file has an upfront cost of 16 µs.

## Limitations

Due to how `chrono` is designed, leap seconds are always ignored, even when
present in the tz file. Also, only Gregorian calendar is supported.

Currently the `Tz::named()` and `Tz::local()` convenient functions are available
on Unix only.

Parsing POSIX TZ rules is not yet supported, so the predicted time for the far
future may be incorrect.