3 个版本
使用旧的 Rust 2015
0.1.4 | 2016年10月23日 |
---|---|
0.1.3 | 2016年10月6日 |
0.1.2 | 2016年9月25日 |
#3 在 #zoneinfo 中
80KB
1K SLoC
zoneinfo-parse
Rust 库,用于读取包含全球时区变化和偏移量的文本文件,这些信息来自多个来源。
zoneinfo 数据库以两种格式之一分发:一种是一个大陆一个文件的原始文本格式,另一种是一个时区一个文件的编译二进制格式。这个包处理前者;对于后者,请参阅zoneinfo_compiled
包。
数据库本身由 IANA 维护。更多信息请参阅IANA 的时区数据库页面。您还可以在tz 仓库中找到这些文本文件。
查看 Rustdoc
格式
zoneinfo 文件包含 Zone
、Rule
和 Link
信息。每种类型的行在 line::Line
枚举中形成一种变体。
为了入门,这里有一些表示 Europe/Madrid
时区时间的行
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Madrid -0:14:44 - LMT 1901 Jan 1 0:00s
0:00 Spain WE%sT 1946 Sep 30
1:00 Spain CE%sT 1979
1:00 EU CE%sT
第一行是注释。第二行以 Zone
开头,因此我们知道
所以解析这五行将返回以下五个结果
- 对于注释,返回
line::Line::Space
,因为该行不包含任何信息(但也不完全是 无效的)。 - 为第一个
line::Line::Zone
条目创建一个Zone
。这包含一个Zone
结构体,用于存储区域名称。所有其他字段都存储在ZoneInfo
结构体中。 - 为下一个条目创建一个
line::Line::Continuation
。这与上面的行不同,因为它不包含名称字段;它只包含ZoneInfo
结构体中的信息。 - 第四行包含与第三行相同类型的数据。
- 第五行也是如此。
具有规则定义的行看起来像这样
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Spain 1917 only - May 5 23:00s 1:00 S
Rule Spain 1917 1919 - Oct 6 23:00s 0 -
Rule Spain 1918 only - Apr 15 23:00s 1:00 S
Rule Spain 1919 only - Apr 5 23:00s 1:00 S
所有这些行都遵循相同的模式:一个包含 Rule
结构体的 line::Line::Rule
,该结构体有一个字段用于每列数据。
最后,有一些行将一个区域链接到另一个区域的名称
Link Europe/Prague Europe/Bratislava
Link
结构体仅包含现有和新时区的名称。
解释
一旦输入行被解析,就必须对它们进行 解释,以形成一个时区数据表。
最简单的方法是使用 TableBuilder
。您可以将各种行添加到构建器中,一旦它检测到错误,如重复或缺失条目,它将抛出错误。当所有行都已馈送到构建器后,您可以使用 build
方法生成一个包含规则、区域和链接行字段的 Table
。
示例程序
此crate用于生成 zoneinfo-data
crate 的数据。有关其使用示例,请参阅捆绑的 数据crate构建器。
依赖项
~5MB
~98K SLoC