#时区 #区域 #时间 #文本格式 #日期时间 #日历 #日期

构建 parse-zoneinfo

从 IANA 数据库解析时区信息文件

6 个版本

0.3.1 2024年5月2日
0.3.0 2020年6月10日
0.2.1 2019年12月21日
0.2.0 2018年7月5日
0.1.0 2017年2月11日

#16 in 日期和时间

Download history 267258/week @ 2024-05-03 287524/week @ 2024-05-10 302617/week @ 2024-05-17 291357/week @ 2024-05-24 372478/week @ 2024-05-31 400389/week @ 2024-06-07 361287/week @ 2024-06-14 412349/week @ 2024-06-21 402234/week @ 2024-06-28 391908/week @ 2024-07-05 388175/week @ 2024-07-12 392138/week @ 2024-07-19 406727/week @ 2024-07-26 397514/week @ 2024-08-02 416928/week @ 2024-08-09 427399/week @ 2024-08-16

1,728,747 每月下载量
725 个 Crates 中使用 (8 直接)

MIT 许可协议

99KB
2K SLoC

parse-zoneinfo

parse-zoneinfo GitHub Actions parse-zoneinfo on crates.io parse-zoneinfo on docs.rs Chat

Rust 库,用于读取包含 时区信息数据库 的文本文件,该数据库记录了来自多个来源的全球时区和偏移量变化。

时区信息数据库以两种格式之一分发:一种是以每个大陆一个文件的方式分发的原始文本格式,另一种是以每个时区一个文件的方式分发的编译二进制格式。此包处理文本格式。

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

parse-zoneinfo 是 Benjamin Sago 的 zoneinfo_parse 的分支(现已不再维护)。它由 chrono-tz 使用。

Rust 版本要求

最低支持的 Rust 版本 (MSRV) 目前是 Rust 1.57.0

使用方法

时区信息文件包含 ZoneRuleLink 信息。每种类型的行都形成 line::Line 枚举中的一个变体。

要开始使用,以下是一些代表 Europe/Madrid 时区时间的几行示例

# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
Zone	Europe/Madrid	-0:14:44 -	LMT	1901 Jan  1  0:00u
			 0:00	Spain	WE%sT	1940 Mar 16 23:00
			 1:00	Spain	CE%sT	1979
			 1:00	EU	CE%sT

第一行是注释。第二行以 Zone 开头,因此我们知道

解析这五行将返回以下五个结果

  • 注释行,因为该行不包含任何信息(但也不是严格意义上的无效)。
  • 第一个Zone条目的line::Line::Zone。这包含一个Zone结构体,其中包含区域名称。其他所有字段都存储在ZoneInfo结构体中。
  • 下一个条目的line::Line::Continuation。这与上面的行不同,因为它不包含名称字段;它只在ZoneInfo结构体中包含信息。
  • 第四行包含与第三行相同类型的数据。
  • 第五行也是如此。

规则定义的行看起来像这样

# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
Rule	Spain	1918	only	-	Apr	15	23:00	1:00	S
Rule	Spain	1918	1919	-	Oct	 6	24:00s	0	-
Rule	Spain	1919	only	-	Apr	 6	23:00	1:00	S
Rule	Spain	1924	only	-	Apr	16	23:00	1:00	S
Rule	Spain	1924	only	-	Oct	 4	24:00s	0	-

所有这些行都遵循相同的模式:一个包含Rule结构体的line::Line::Rule,该结构体为数据的每一列都有一个字段。

最后,有一些行将一个区域链接到另一个区域的名称

# Link	TARGET			LINK-NAME	#= TARGET1
link	Australia/Sydney	Australia/ACT	#= Australia/Canberra

Link结构体简单地包含现有和新的时区的名称。

解释

一旦解析了输入行,就必须对它们进行解释以形成时区数据表。

完成此操作的最简单方法是使用TableBuilder。您可以向构建器添加各种行,一旦检测到错误(例如重复或缺失条目),它就会抛出错误。当所有行都输入到构建器中时,您可以使用build方法生成一个包含规则、区域和链接行字段的Table

示例程序

此crate的example文件夹包含一个基本的解析器示例。

parse-zoneinfo用于生成chrono-tz的数据。有关其使用的完整示例,请参阅chrono-tz-build

依赖关系

~2.7–4MB
~65K SLoC