1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-09 22:21:29 +00:00

Fix (again) the Windows date representation problem.

This commit is contained in:
dmiller
2020-10-10 13:37:03 +00:00
parent e333addec4
commit b9bb2ec387
3 changed files with 19 additions and 17 deletions

View File

@@ -42,24 +42,26 @@ function record_skew(host, timestamp, received)
end
-- Work around Windows error formatting time zones where 1970/1/1 UTC was 1969/12/31
system_time_at_epoch = (
time({year=1970, month=1, day=2, hour=0}) -- local time on 1970/1/2
- 86400 -- minus 1 day = local time at 1970/1/1
- time(date("!*t", 0)) -- minus UTC offset (Windows). On *nix this is 0.
)
-- Find the offset in seconds between local time and UTC. That is, if we
-- interpret a UTC date table as a local date table by passing it to os.time,
-- how much must be added to the resulting integer timestamp to make it
-- correct?
local function utc_offset(t)
local utc_offset_seconds
do
-- What does the calendar say locally?
local localtime = date("*t", t)
local localtime = date("*t", 86400)
-- What does the calendar say in UTC?
local gmtime = date("!*t", t)
local gmtime = date("!*t", 86400)
-- Interpret both as local calendar dates and find the difference.
return difftime(time(localtime), time(gmtime))
utc_offset_seconds = difftime(time(localtime), time(gmtime))
end
-- The offset in seconds between local time and UTC.
--
-- That is, if we interpret a UTC date table as a local date table by passing
-- it to os.time, how much must be added to the resulting integer timestamp to
-- make it correct?
--
-- In other words, subtract this value from a timestamp if you intend to use it
-- in os.date.
function utc_offset() return utc_offset_seconds end
--- Convert a date table into an integer timestamp.
--
-- Unlike os.time, this does not assume that the date table represents a local
@@ -83,7 +85,7 @@ function date_to_timestamp(date_t, offset)
return nil
end
offset = offset or 0
return tm + utc_offset(tm) - offset
return tm + utc_offset() - offset
end
local function format_tz(offset)
@@ -140,7 +142,7 @@ function format_timestamp(t, offset)
if tmp > 0xffffffff then
-- Maybe too far in the future?
extra_years = (tmp - 0xffffffff) // seconds_in_year + 1
elseif tmp < system_time_at_epoch then
elseif tmp < -utc_offset() then
-- Windows can't display times before the epoch
extra_years = tmp // seconds_in_year
end

View File

@@ -825,7 +825,7 @@ function convertADTimeStamp(timestamp)
local result = 0
-- Windows cannot represent this time, so we pre-calculated it:
-- seconds since 1601/1/1 adjusted for local offset
local base_time = -11644473600 + datetime.system_time_at_epoch
local base_time = -11644473600 - datetime.utc_offset()
timestamp = tonumber(timestamp)

View File

@@ -157,7 +157,7 @@ do
end
-- This constant is number of seconds from 1900-01-01 to 1970-01-01
local tds_offset_seconds = -2208988800 + datetime.system_time_at_epoch
local tds_offset_seconds = -2208988800 - datetime.utc_offset()
-- *************************************
-- Informational Classes