LUA 获取最近的 夏令时 变化时间

文章提供了一段Lua代码,用于处理海外游戏在夏令时切换时界面时间的刷新问题。代码包括了时区判断、时间转换以及寻找下一个夏令时开始或结束时间的函数,确保在夏令时变化时能正确更新时间显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做海外游戏,遇到夏令时切换的问题, 需求是夏令时切换的时候要刷新界面上的时间。

测试调用1000次,耗时20毫秒,直接上代码。

注意:要判断1月1号和6月1号的时区是否一样, 不一样的才有夏令时,不是所有机器都有夏令时。

function table.clone(object, isArray)
    local pi
    if isArray then
        pi = ipairs
    else
        pi = pairs
    end
    local newTab = {}
    for i,v in pi(object) do
        local t = type(v)
        if t == "table" then
            newTab[i] = table.clone(v, isArray)
        elseif t == "string" or t == "number" then
            newTab[i] = v
        end
    end
    return newTab
end

time = {}

--获取时差
function time.timeZone()
    local now = os.time()   --当前时间戳
    local utcTab = os.date("!*t", now)
    local nowTab = os.date("*t", now)
    return now - os.time(utcTab) + (nowTab.isdst and 3600 or 0)
end

function time.time2tab(unixTime)
    return os.date("*t", unixTime)
end

function time.tab2time(tab)
    tab.isdst = nil
    return os.time(tab)
end

function time.nextDstTime()
    local timeNow = os.time()
    local timeTab = time.time2tab(timeNow)
    local isdst = timeTab.isdst
    local function _nextZeroTime(timeTab, _month, _addYear, needDST)
        timeTab.year = timeTab.year + _addYear
        timeTab.month = _month
        timeTab.day = 1
        timeTab.hour = 0
        timeTab.min = 0
        timeTab.sec = 0
        local wday = time.time2tab(time.tab2time(timeTab)).wday
        timeTab.day = timeTab.day + (8-wday) + (_month == 3 and 7 or 0) --3月的第2个星期日~11月的第1个星期日
        
        local startTime = time.tab2time(timeTab)
        for i=1,100 do
            if time.time2tab(startTime).isdst == needDST then
                return startTime
            end
            startTime = startTime + 3600
        end
        ERROR("_nextZeroTime fail.")
    end

    --今年夏令时开始
    local startTime = _nextZeroTime(table.clone(timeTab), 3, 0, true)
    if timeNow < startTime then
        return startTime
    end
    --今年夏令时结束
    startTime = _nextZeroTime(table.clone(timeTab), 11, 0, false)
    if timeNow<=startTime then
        return startTime
    end
    --明年夏令时开始
    startTime = _nextZeroTime(table.clone(timeTab), 3, 1, true)
    if timeNow<=startTime then
        return startTime
    else
        ERROR("nextDstTime fail.")
    end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值