最近,游戏要上国外运营了,搞完就算告一段落了……放下种种不舍,搞好时区的问题,好好的送它一程吧
受时区影响的问题主要分两类,一类是运营活动,一类是特殊玩法的开启。每天定时刷新的本来就有考虑时区,略过不表
运营活动设计的时候已经考虑到时区,每个活动设计的时候,都需要填写活动开启的日期、时间及时区,这方面问题简化了很多。中间需要修改的,是偶尔有几个活动自作聪明,没有用库提供的日期计算函数,自己拿秒数来算。换上考虑时区的函数之后,就没有问题了。核心代码如下:
local TD = TIMEZONE * 3600 local SECONDS_PER_DAY = 24 * 3600 function date.count_day(t1, t2, reset_time) if t1 > t2 then t1, t2 = t2, t1 end t1 = t1 + TD - reset_time t2 = t2 + TD - reset_time local day1 = t1 // SECONDS_PER_DAY local day2 = t2 // SECONDS_PER_DAY return math.floor(day2 - day1) end
其他特殊玩法设计的时候没有让策划考虑时区的配置,而是一刀切,一切按导表的时区来。策划填的年月日-时分秒,最后导出的是一个UTC的时间戳,这个是按导表时机器所在的时区来转换的。因为同一个打包环境,要打出国内外的包,所以稍微需要做点修改。这里有个讨巧的办法,lua没有API可以取出系统时区,但是os.date通过传递不同参数,可以获得UTC时间和本地时间。这样就可以间接得到打包机的时区,再加上到目标时区的偏移就行了,核心代码如下:
function get_timezone() local a=os.time() local b=os.time(os.date("!*t")) return ((a-b)/3600) end