3 个版本

使用旧的 Rust 2015

0.1.4 2016年10月23日
0.1.3 2016年10月6日
0.1.2 2016年9月25日

#3#zoneinfo

MIT 许可证

80KB
1K SLoC

zoneinfo-parse 构建状态 覆盖率状态

Rust 库,用于读取包含全球时区变化和偏移量的文本文件,这些信息来自多个来源。

zoneinfo 数据库以两种格式之一分发:一种是一个大陆一个文件的原始文本格式,另一种是一个时区一个文件的编译二进制格式。这个包处理前者;对于后者,请参阅zoneinfo_compiled

数据库本身由 IANA 维护。更多信息请参阅IANA 的时区数据库页面。您还可以在tz 仓库中找到这些文本文件。

查看 Rustdoc

格式

zoneinfo 文件包含 ZoneRuleLink 信息。每种类型的行在 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