Skip to content

finish the tzdb zic compiler #20

Open
@BurntSushi

Description

@BurntSushi

In src/tz/zic.rs, there is a complete parser for the zic input format. zic is a tool maintained by the IANA Time Zone Database. It is the tool that converts a plain text description of time zone rules into the binary format used in /usr/share/zoneinfo. For example, here are the DST rules for the United States and the time zone definition of America/New_York (taken from the northamerica file in the data (or complete) tzdb distribution):

# Rule	NAME	FROM	TO	-	IN	ON	AT	SAVE	LETTER/S
Rule	US	1918	1919	-	Mar	lastSun	2:00	1:00	D
Rule	US	1918	1919	-	Oct	lastSun	2:00	0	S
Rule	US	1942	only	-	Feb	9	2:00	1:00	W # War
Rule	US	1945	only	-	Aug	14	23:00u	1:00	P # Peace
Rule	US	1945	only	-	Sep	30	2:00	0	S
Rule	US	1967	2006	-	Oct	lastSun	2:00	0	S
Rule	US	1967	1973	-	Apr	lastSun	2:00	1:00	D
Rule	US	1974	only	-	Jan	6	2:00	1:00	D
Rule	US	1975	only	-	Feb	lastSun	2:00	1:00	D
Rule	US	1976	1986	-	Apr	lastSun	2:00	1:00	D
Rule	US	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
Rule	US	2007	max	-	Mar	Sun>=8	2:00	1:00	D
Rule	US	2007	max	-	Nov	Sun>=1	2:00	0	S

# Rule	NAME	FROM	TO	-	IN	ON	AT	SAVE	LETTER
Rule	NYC	1920	only	-	Mar	lastSun	2:00	1:00	D
Rule	NYC	1920	only	-	Oct	lastSun	2:00	0	S
Rule	NYC	1921	1966	-	Apr	lastSun	2:00	1:00	D
Rule	NYC	1921	1954	-	Sep	lastSun	2:00	0	S
Rule	NYC	1955	1966	-	Oct	lastSun	2:00	0	S

# Zone	NAME		STDOFF	RULES	FORMAT	[UNTIL]
		#STDOFF	-4:56:01.6
Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 17:00u
			-5:00	US	E%sT	1920
			-5:00	NYC	E%sT	1942
			-5:00	US	E%sT	1946
			-5:00	NYC	E%sT	1967
			-5:00	US	E%sT

The src/tz/zic.rs already knows how to parse all of the above. My original plan was to have Jiff support reading from these Zic input files as an alternative to the standard binary TZif based zoneinfo database. But once I got to the point of actually turning the rules into something actionable, I stumbled quite a bit. The zic.c code in particular that I believe we want to port is here.

The main reason for supporting this format (in addition to TZif) is that it is very compact. And potentially opens the door to defining custom time zones via a human readable semi-standard format. It would also hopefully enable jiff-cli to compile its own time zone database without using the tzdb C toolchain, although that isn't nearly as important.

@jhpratt expressed interest in collaborating on this. I think the main issue I see with collaboration here is that I would want the Zic compiler to be inside Jiff itself. In theory, it could be split into a jiff-zic crate or something, but at least as of present, the Zic data types all make pretty extensive use of Jiff's civil time datatypes and ranged integer types. So splitting this out would either mean splitting Zic's civil times into a separate that that both jiff and jiff-zic could depend upon, or it would mean copying at least some parts of the civil time code. (For example, the code that converts between civil time and timestamps, and the code for determining the nth weekday. And maybe other things.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestquestionFurther information is requested

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions