时区

全球划分为24个时区(东、西各12个时区)。规定英国为中时区(零时区)、东1-12区,西1-12区,东正西负。东、西第12区各跨经度7.5度,以东、西经180度为界。计算方法:时刻东进(+)西退(-),日期东退(-)西进(+)。也就是说,时刻向东每过一个时区要加上一个小时,向西每过一个时区减去一个小时。(相邻两个时区的时间相差1小时)

东八区时间转UTC java 东八区十二小时时差_服务器


全球时区划分

 
我国东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