转载于:http://lua-users.org/wiki/TimeZone
The following function portably returns a timezone string in the form +hhmm
or -hhmm
. One cannot use os.date("%z")
as the format of its return value is non-portable; in particular, Windows systems don't use the C99 semantics for strftime()
. The following code should portably produce a timezone string for the current local time.
NOTE: the following only computes the timezone offset for "now", which differs from os.date("%z")
which can handle times in the past or future, taking daylight savings time into account. Alternatively, you can use get_timezone_anystamp(ts) below
-
-- Compute the difference in seconds between local time and UTC. local function get_timezone() local now = os.time() return os.difftime(now, os.time(os.date("!*t", now))) end timezone = get_timezone() -- Return a timezone string in ISO 8601:2000 standard form (+hhmm or -hhmm) local function get_tzoffset(timezone) local h, m = math.modf(timezone / 3600) return string.format("%+.4d", 100 * h + 60 * m) end tzoffset = get_tzoffset(timezone) --[[ debugging for _, tz in ipairs(arg) do if tz == '-' then tz = timezone else tz = 0 + tz end print(tz, get_tzoffset(tz)) end --]] -- return the timezone offset in seconds, as it was on the time given by ts -- Eric Feliksik local function get_timezone_offset(ts) local utcdate = os.date("!*t", ts) local localdate = os.date("*t", ts) localdate.isdst = false -- this is the trick return os.difftime(os.time(localdate), os.time(utcdate)) end