Help With Understanding the Binary Files
Guy Harris
guy at alum.mit.edu
Wed Dec 9 18:02:36 UTC 2009
On Dec 9, 2009, at 6:09 AM, Bill Seymour wrote:
> Could somebody please help me interpret the tz
> binary files?
>
> I'm having trouble understanding what to do with
> the two arrays that follow the leap second array.
>
> 1. tzfile.h says that they're "indexed by type";
> but I don't see anything in the "type" (which I
> take to mean what tzfile.5 calls "struct ttinfo")
> that could be used as such an index. Does
> "indexed by type" mean "having the same index
> as the type", in other words, the value from
> the array following the transition time array?
Yes. The "number of local time types" is what's stored in the
tzh_typecnt field, so the array of structures containing
coded UTC offset in seconds
tm_isdst value
abbreviation list index
is indexed by the local time type (as it has tzh_typecnt elements),
and the array following the transition time array is an array of
"types of local time starting at above".
See also "man tzfile" on UN*X systems that use the Olson code (and
that bother to install the man page).
> 2. tzfile.h seems to imply that these booleans
> indicate how I should interpret the values in
> the array of transition times. Is that correct?
> If so, how do I calculate standard time while
> DST is being observed given that the SAVE column
> in the Rule has been lost? Do I assume that the
> offset for DST is always exactly 1 hour?
No. Presumably "standard time", at a time when DST is being observed,
is what the time would have been had the most recent standard time ->
DST transition not happened (note that the offset between GMT and
*standard* time in a particular time zone can change over time, so
it's not as if a given location has to remain at the same offset from
GMT forever), so you should get the offset from GMT for the entry
prior to the current entry.
> 3. tzfile.5 says that these "are used when a time
> zone file is used in handling POSIX-style time zone
> environment variables." Does that mean that the
> "transition times" are the ones in the TZ variable,
No.
It means that the TZ variable can be in one of the following forms:
:{pathname}, in which case the part of TZ after the : is the pathname
of the time zone file to use - absolute if it begins with /, relative
to the directory containing the zoneinfo files if it doesn't begin
with /;
{something not beginning with :}, in which case the value of TZ in
its entirety is used as a pathname, and if the pathname (again,
absolute if it begins with /, relative to the directory containing the
zoneinfo files if it doesn't begin with /) refers to a time zone file
that can be read, that file is used, otherwise it's used as a POSIX-
style time zone setting.
If it's used as a POSIX-style time zone setting rather than as a file
name, and the setting of TZ includes no transition rules, the time
zone file "posixrules", in the directory containing the zoneinfo
files, is used to specify when transitions between standard time and
DST happen. See the tzset man page:
rule Indicates when to change to and back from
summer time.
The rule has the form:
date/time,date/time
where the first date describes when the
change from
standard to summer time occurs and the second
date
describes when the change back happens. Each
time
field describes when, in current local time,
the
change to the other time is made.
The format of date is one of the following:
J n The Julian day n (1 <= n <= 365).
Leap days
are not counted; that is, in all
years --
including leap years -- February 28
is day 59
and March 1 is day 60. It is
impossible to
explicitly refer to the occasional
February
29.
n The zero-based Julian day (0 <= n <=
365 ) .
Leap days are counted, and it is
possible to
refer to February 29.
M m.n.d The d'th day (0 <= d <= 6) of week n
of month
m of the year (1 <= n <= 5), (1 <= m
<= 12),
where week 5 means ``the last d day
in month
m'' which may occur in either the
fourth or
the fifth week). Week 1 is the
first week in
which the d'th day occurs. Day zero
is Sun-
day.
The time has the same format as
offset except
that no leading sign (`-') or (`+') is
allowed. The default, if time is
not given,
is 02:00:00.
If no rule is present in the TZ
specification, the
rules specified by the tzfile(5)-format file
posixrules in the system time conversion
information
directory are used, with the standard and
summer time
offsets from UTC replaced by those specified
by the
offset values in TZ.
More information about the tz
mailing list