#时区 #区域 #chrono #tz #系统 #解析 #数据库

tzfile

使用系统时区数据库的chrono::TimeZone实现

4个版本

0.1.3 2021年3月21日
0.1.2 2020年5月30日
0.1.1 2019年12月22日
0.1.0 2019年4月23日

日期和时间 类别中排名 156

Download history 109/week @ 2024-03-16 68/week @ 2024-03-23 171/week @ 2024-03-30 119/week @ 2024-04-06 105/week @ 2024-04-13 106/week @ 2024-04-20 111/week @ 2024-04-27 116/week @ 2024-05-04 83/week @ 2024-05-11 45/week @ 2024-05-18 55/week @ 2024-05-25 47/week @ 2024-06-01 53/week @ 2024-06-08 63/week @ 2024-06-15 48/week @ 2024-06-22 33/week @ 2024-06-29

每月下载 200
3 个库中使用

MIT 协议

41KB
814

tzfile

Crates.io docs.rs Build status MIT License

tzfile 是一个使用系统 时区数据库chrono::TimeZone 实现。它可以将 /usr/share/zoneinfo 中的编译(二进制)时区文件解析为 chrono 的时间区对象。

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");

tzfilechrono-tz 的比较

tzfile 从操作系统动态加载时区信息,而 chrono-tz 锁定到特定的tz数据库版本,并将解析结果静态嵌入到生成的可执行文件中。

tzfile 的用户可以获得与系统相同的时区配置,并保证与其他非Rust程序具有相同的行为。但是,某些系统不提供完整的tz数据库(例如Windows),这使得程序在多个平台之间不可移植。

性能

UTC到本地时间的转换与 chrono-tz 的性能相当,因为两者都使用相同的数据结构(排序数组)。在反向方向(本地到UTC)中,tzfile 缓存转换表,允许在所有情况下都比 chrono-tz 快。

时区类型 亚洲/德黑兰 → UTC UTC → 亚洲/德黑兰
&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

注意:解析tz文件的前期成本为16 µs。

限制

由于 chrono 的设计方式,即使tz文件中存在,也会始终忽略闰秒。此外,仅支持格里高利历。

目前,方便函数 Tz::named()Tz::local() 仅在Unix上可用。

尚不支持解析POSIX TZ规则,因此对遥远未来的预测可能不正确。

依赖关系

~1.5MB
~20K SLoC