对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。
- 时区算法
- 常见的时间描述
- 时区需要计算的点
- 在lua语言中的写法
- os.time() 函数相关用法:
- os.date() 函数相关用法:
- 扩展用法
- os.difftime() 函数相关用法:
- 时间差算法
- 在js语言中的写法
- Date() 创建一个新的日期对象:
- getTime() 获取日期对象的时间戳(毫秒数):
- getFullYear(), getMonth(), getDate(), getHours(), getMinutes(), getSeconds() 获取日期的各个部分:
- setTimeout() 在指定的毫秒数后执行一个函数:
- setInterval() 每隔指定的毫秒数重复执行一个函数:
- clearTimeout(), clearInterval() 取消setTimeout()和setInterval()设置的函数调用:
- 时间差算法
- 按照格林威治进行格式化,将当前时间转换为标准时间来计算时差
- 判断是否为日光节约时间(夏令时)
时区算法
常见的时间描述
GMT(格林威治平均时间,Greenwich Mean Time)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。
UTC(协调世界时,取自英文和法文的缩写,英文是Coordinated Universal Time)是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林威治标准时间。
本地时间是指在日常生活中所使用的时间。这个时间等于我们所在(或者所使用)时区内的当地时间,它由与世界标准时间(UTC或GMT)之间的偏移量来定义。
GMT+08:00(UTC+8)即北京时间,比协调世界时快八小时。注意北京时间并不是北京的地方时间。
unix时间戳是从UTC1970年1月1日0时0分0秒(UTC/GMT的午夜)起至现在的总秒数,不考虑闰秒。因此时间戳不会因为时区的不同而不同。
夏令时(Daylight Saving Time:DST),又称日光节约时间,是为了节约能源,人为规定的时间。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。
时间戳不受时区影响,或者说它只针对于UTC时间。对于同一时刻,不同时区的时间戳都是唯一的。
时区需要计算的点
1:将服务器时间转换为标准时间(即格林威治标准时间)
2:根据服务器的时间来判断当前是否存在夏令时(即日光节约时间)
3:用服务器时间减去时差加上夏令时为最终的时区差
在lua语言中的写法
在Lua中,可以使用os.time()函数获取当前时间戳;使用os.date()函数格式化时间;使用os.difftime()来计算时间差。
下面是对应用法:
os.time() 函数相关用法:
获取当前时间戳
local nowTime = os.time()
print(nowTime) -- 输出当前时间戳(以秒为单位) 如此时1711519120
os.date() 函数相关用法:
可以输出固定格式的时间:
local titleTime = os.date("%Y-%m-%d %H:%M:%S", nowTime)
print(titleTime) -- 输出2024-03-27 13:58:12