Time Zone

lua-users home
wiki

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



See Also


RecentChanges · preferences
edit · history
Last edited January 21, 2013 1:18 pm GMT (diff)