12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- -- tz -- A simple timezone module for interpreting zone files
- local M = {}
- local tstart = 0
- local tend = 0
- local toffset = 0
- local thezone = "eastern"
- function M.setzone(zone)
- thezone = zone
- return M.exists(thezone)
- end
- function M.exists(zone)
- return file.exists(zone .. ".zone")
- end
- function M.getzones()
- local result = {}
- for fn, _ in pairs(file.list()) do
- local _, _, prefix = string.find(fn, "(.*).zone")
- if prefix then
- table.insert(result, prefix)
- end
- end
- return result
- end
- local function load(t)
- local z = file.open(thezone .. ".zone", "r")
- local hdr = z:read(20)
- local magic = struct.unpack("c4 B", hdr)
- if magic == "TZif" then
- local lens = z:read(24)
- local ttisgmt_count, ttisdstcnt, leapcnt, timecnt, typecnt, charcnt -- luacheck: no unused
- = struct.unpack("> LLLLLL", lens)
- local times = z:read(4 * timecnt)
- local typeindex = z:read(timecnt)
- local ttinfos = z:read(6 * typecnt)
- z:close()
- local offset = 1
- local tt
- for i = 1, timecnt do
- tt = struct.unpack(">l", times, (i - 1) * 4 + 1)
- if t < tt then
- offset = (i - 2)
- tend = tt
- break
- end
- tstart = tt
- end
- local tindex = struct.unpack("B", typeindex, offset + 1)
- toffset = struct.unpack(">l", ttinfos, tindex * 6 + 1)
- else
- tend = 0x7fffffff
- tstart = 0
- end
- end
- function M.getoffset(t)
- if t < tstart or t >= tend then
- -- Ignore errors
- local ok, msg = pcall(function ()
- load(t)
- end)
- if not ok then
- print (msg)
- end
- end
- return toffset, tstart, tend
- end
- return M
|