问题来源:服务器的时间是固定的,国内一般都设置为北京时间(东8时区的时间),
而客户端分布在世界各地,客户端系统设置的时区是不固定的。
很多时候在设计时,没有考虑时区不一致的情况,直接使用时间戳来进行时间转换和比较,往往出现很多预想不到的问题。
基本概念/方法:
1、【时区】:全世界分24个时区,0时区是英国(格林尼治天文台旧址,经度为0,即本初子午线经过地),北京为东8区,每个相邻的时区时间相差1个小时。
2、【时间戳】:是指格林尼治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
3、获取时间戳的方法:local t = os.time() (同一时刻任何地点的时间戳都是一样的,即相对于各时区起始时间经过的总秒数)
4、时间戳转换成字符串时间的方法:
4.1 local timeStr = os.date("*t", timestamp) 将时间戳转换为本时区的时间table
4.2 local timeStr = os.date("!*t", timestamp) 将时间戳转换成0时区的时间table
4.3 local timeStr = os.date("%Y-%m-%d %H:%M:%S", timestamp) 将时间戳转换成本时区时间字符串
其中时间table 的结构是:{year=2018,month=6,day=5,hour=12,min=2,sec=30}
5、字符串时间转时间戳的方法:
local now = {year=2018,month=6,day=5,hour=12,min=2,sec=30}
local timestamp = os.time(now)
1、服务器固定为北京时区时间,所有使用的时间戳以及yyyymmdd类似的时间字符串,都是北京时间。
2、整个应用/游戏所显示的时间、用于计算的时间都统一使用北京时间。
3、时间戳转字符串时,都换算并显示为北京时间
4、字符串转时间戳时,都转为北京时区该时间点的时间戳
一、获得此刻北京时区的时间字符串
local t = os.time() -- 时间戳
t = t + 8 * 60 * 60 -- 加上北京时区与0时区的时间差
local now = os.date("!*t", t) -- 获得此刻0时区的时间结构体,即可显示为当时北京时区的时间
验证(在命令行输入 lua 回车后,进入lua模式,在运行如下脚本)
t = os.time()
t = t + 28800
now = os.date("!*t", t)
print(string.format("%04d-%02d-%02d %02d:%02d:%02d", now.year, now.month, now.day, now.hour, now.min, now.sec))
二、获得本时区与北京时区的时间差
local function GetTimeDiff()
local t = os.time() -- 时间戳
local shicha = 28800 - os.difftime(now, os.time(os.date("!*t", now))) -- 计算时差
return shicha
end
三、时间戳转字符串:
3.1 当使用os.date(“%Y-%m-%d %H:%M:%S”, timeStamp + shicha) 进行格式化时间戳时,需要加上与北京时区的时间差, local shicha = GetTimeDiff()
local timeStr = os.date(“%Y-%m-%d %H:%M:%S”, os.time() + shicha)
3.2 不能直接用 os.date(format, os.time()) 或 os.date(*t, os.time()) 来企图获得北京时区的时间字符串