最近,游戏要上国外运营了,搞完就算告一段落了放下种种不舍,搞好时区的问题,好好的送它一程吧

受时区影响的问题主要分两类,一类是运营活动,一类是特殊玩法的开启。每天定时刷新的本来就有考虑时区,略过不表

运营活动设计的时候已经考虑到时区,每个活动设计的时候,都需要填写活动开启的日期、时间及时区,这方面问题简化了很多。中间需要修改的,是偶尔有几个活动自作聪明,没有用库提供的日期计算函数,自己拿秒数来算。换上考虑时区的函数之后,就没有问题了。核心代码如下:

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