local tz_info_mt = require "luatz.tzinfo".tz_info_mt
+local tt_info_mt = require "luatz.tzinfo".tt_info_mt
+
local function read_int32be ( fd )
local data , err = fd:read ( 4 )
local isgmt = assert ( read_flags ( fd , tzh_ttisgmtcnt ) )
- if version == "2" then
+ local TZ
+
+ if version == "2" or version == "3" then
--[[
For version-2-format timezone files, the above header and data is followed by a second header and data,
identical in format except that eight bytes are used for each transition time or leap-second time.
for use in handling instants after the last transition time stored in the file
(with nothing between the newlines if there is no POSIX representation for such instants).
]]
+
+ --[[
+ For version-3-format time zone files, the POSIX-TZ-style string may
+ use two minor extensions to the POSIX TZ format, as described in newtzset (3).
+ First, the hours part of its transition times may be signed and range from
+ -167 through 167 instead of the POSIX-required unsigned values
+ from 0 through 24. Second, DST is in effect all year if it starts
+ January 1 at 00:00 and ends December 31 at 24:00 plus the difference
+ between daylight saving and standard time.
+ ]]
+
+ assert ( assert ( fd:read ( 1 ) ) == "\n" , "Expected newline at end of version 2 header" )
+
+ TZ = assert ( fd:read ( "*l" ) )
+ if #TZ == 0 then
+ TZ = nil
+ end
end
for i=1, tzh_typecnt do
v.abbr = abbreviations:sub ( v.abbrind+1 , v.abbrind+3 )
v.isstd = isstd [ i ] or false
v.isgmt = isgmt [ i ] or false
+ setmetatable ( v , tt_info_mt )
end
--[[