时区
全球划分为24个时区(东、西各12个时区)。规定英国为中时区(零时区)、东1-12区,西1-12区,东正西负。东、西第12区各跨经度7.5度,以东、西经180度为界。计算方法:时刻东进(+)西退(-),日期东退(-)西进(+)。也就是说,时刻向东每过一个时区要加上一个小时,向西每过一个时区减去一个小时。(相邻两个时区的时间相差1小时)
全球时区划分
我国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间迟1小时。
时间差 = 时区差
时区计算举例:
例1:已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时。
(+9)(东九区) – (+8)( 东八区) = 12:00 – x
X = 12:00 – 1 = 11:00
例2:已知北京时间为5月1日12:00,求纽约(西五区)的区时
(+8)(东八区) – (-5)( 西五区) = 12:00 – y
Y = 12:00 – 13 = 23:00 (4月30日)
lua 中时区计算
local os_time = os.time() -- 返回时间戳,不受时区影响,单位秒
local os_date = os.date("*t", os_time) -- 把时间戳转换为日期,受到时区的影响,
--就是说会自动转换为当前时区的时间
local os_date2 = os.date("*t", os_time) -- 把时间戳转换为日期,不受时区的影响,
--因为它返回的是格林尼治(时区是0)的时间
local timezone = os.difftime(os_time, os.time(os.date("!*t", os_time))) / 3600 -- 当前时区
案例1:假设某个活动(暂称情缘活动)在某天开放,在那天11:00过后可以购买道具,怎么判断是否到了11:00?
(活动的开启控制假设在其他地方,在这里假设活动已经开启了,不再处理活动开启相关。)
解析:注意11:00是服务器上的11:00,如果我们在其他时区,那么当服务器上是11:00时我们的时间并不是
11:00,不能通过os_date的hour来和11:00比较。我们的目标是把时间转换为服务器所在时区的时间。
假设服务器在东8区,我们在东2区,我们的时间会比服务器晚6个小时。
local currentTimeZone = 2
local serverTimeZone = 8
local os_time = os.time() -- 获取时间戳
-- 如果直接把这个时间戳转换为我们时区的时间,结果会比服务器小6个小时,所以即使服务器上已经
-- 是11:00,我们转换到本地后我们的时间是5:00,所以我们要补偿上6个小时
local time_stamp_server = os_time + (serverTimeZone - currentTimeZone) * 60 * 60 -- 补偿
local time_server = os.date("*t", time_stamp_server) -- 得到服务器上的时间
if time_server.hour >= 11 then
-- do something
else
-- do something
end
封装:
function GetTimeZone()
local os_time = os.time()
return os.difftime(os_time, os.time(os.date("!*t", os_time))) / 3600
end
function GetServerTimeHour(serverTimeZone, timeStamp)
local time_stamp_server = timeStamp + (serverTimeZone - GetTimeZone()) * 60 * 60
-- 如果需要考虑夏令时的影响
-- local isDst = os.date("*t").isdst
-- time_stamp_server = time_stamp_server - (isDst and 1 or 0) * 60 * 60
local time_server = os.date("*t", time_stamp_server)
return time_server.hour
end