lua 写一个 不同时区之间转换日期和时间 函数

这个函数用于调整时间戳以适应不同的时区。它接受五个参数:`format`、`timeStamp`、`dontFixForTimeOffset`、`currentServerTimeZone`和`showLog`。返回 os.date,可以转化成指定格式的年月日时间

功能

该函数的主要功能是根据给定的时区偏移量调整时间戳,并返回格式化后的日期字符串。如果`dontFixForTimeOffset`为真或者时间戳小于31536001(即1970年1月1日之后的秒数),则直接返回原始时间戳的格式化日期。否则,它会根据当前服务器时区与本地时区之间的差异调整时间戳,并返回调整后的日期字符串。

参数

  • `format`:日期格式字符串,用于指定返回日期字符串的格式。

  • `timeStamp`:要调整的时间戳。如果未提供,则默认使用当前时间。

  • `dontFixForTimeOffset`:布尔值,指示是否不调整时区偏移量。

  • `currentServerTimeZone`:当前服务器的时区偏移量。如果未提供,则使用默认的`TimeUtil.timeZone`。

  • `showLog`:布尔值,指示是否在日志中显示调试信息。

实现原理

  1. **日志记录**:如果`showLog`为真,则记录时间戳和其类型。

  2. **默认时间戳**:如果未提供时间戳,则使用当前时间。

  3. **时区偏移量计算**:如果`dontFixForTimeOffset`为假且时间戳大于31536001,则计算当前服务器时区与本地时区之间的偏移量。

  4. **时间戳格式判断**:判断时间戳是秒还是毫秒。如果是毫秒,则将其转换为秒。

  5. **时区调整**:根据时区偏移量调整时间戳,并考虑夏令时的影响。

  6. **格式化日期**:使用调整后的时间戳格式化日期字符串。

  7. **日志记录**:如果`showLog`为真,则记录调整后的时间戳。

  8. **返回结果**:返回格式化后的日期字符串。

注意事项

  • 确保在调用此函数之前,`TimeUtil`对象已经正确初始化,并且`getTimeZone`方法能够返回正确的时区偏移量。

  • `currentServerTimeZone`参数应该是一个整数,表示时区偏移量(例如,中国标准时间(CST)为+8小时,偏移量为8)。

  • `timeStamp`参数可以是秒或毫秒,函数会自动进行转换。

  • 如果`showLog`为真,则会在日志中输出调试信息,这可能会影响性能,建议在生产环境中关闭。

Lua 复制代码
function TimeUtil:fixTimeZoneFor_LUA_OS_DATE(format, timeStamp,dontFixForTimeOffset, currentServerTimeZone, showLog)

    if showLog then
        print("[fixTimeZoneFor_LUA_OS_DATE] : %s-%s",timeStamp,type(timeStamp))
    end

    if timeStamp == nil then
        timeStamp = os.time()
    end

    if dontFixForTimeOffset or timeStamp < 31536001 then
        return os.date(format, timeStamp)
    else
        -- 8 hour * 3600 seconds = 28800 seconds
        local timeZone = self:getTimeZone()
        if currentServerTimeZone == nil then
            currentServerTimeZone = TimeUtil.timeZone
        end

        local timeZoneOffset = currentServerTimeZone - timeZone
        local isMilli = false
        if timeStamp == nil then
            isMilli = false
        else
            timeStamp = math.ceil(timeStamp)
            -- 判定毫秒与秒
            local numberStr = tostring(math.ceil(timeStamp))
            if #numberStr <= 10 then
                isMilli = false
            elseif #numberStr == 13 then
                isMilli = true
            end
        end

        local eastEightTimeStamp
        if isMilli == false then
            eastEightTimeStamp = timeStamp + (timeZoneOffset) * 3600 + (os.date("*t", timeStamp).isdst and -1 or 0) * 3600
        elseif isMilli then
            timeStamp = math.ceil(tonumber(timeStamp) / 1000)
            eastEightTimeStamp = timeStamp + (timeZoneOffset) * 3600 + (os.date("*t", timeStamp).isdst and -1 or 0) * 3600
        else
            Logger.print("[FixTimeZone Exception] Fatal timestamp format : %s", timeStamp)
        end

        if showLog then
            Logger.print("[eastEightTimeStamp] : %s", eastEightTimeStamp)
        end
        --return timeStamp
        return os.date(format, eastEightTimeStamp)
    end

end
相关推荐
Lhan.zzZ8 分钟前
Qt数据可视化实战:饼图、线图与表格的完整指南
开发语言·qt·信息可视化
Acrelhuang10 分钟前
筑牢用电防线:Acrel-1000 自动化系统赋能 35kV 园区高效供电-安科瑞黄安南
java·大数据·开发语言·人工智能·物联网
勿忘初心9126 分钟前
游戏手柄遥控越疆协作机器人[一]
游戏·机器人
小龙报29 分钟前
《算法通关指南数据结构和算法篇(4)--- 队列和queue》
c语言·开发语言·数据结构·c++·创业创新·学习方法·visual studio
全栈软件开发30 分钟前
萌猫 合并卡牌 RPG抽卡游戏 Unity3D休闲益智游戏源码完整项目
游戏·unity源码
民乐团扒谱机36 分钟前
深入浅出理解克尔效应(Kerr Effect)及 MATLAB 仿真实现
开发语言·matlab·光学·非线性光学·克尔效应·kerr effect
7澄143 分钟前
深入解析 LeetCode 数组经典问题:删除每行中的最大值与找出峰值
java·开发语言·算法·leetcode·intellij idea
计算衎1 小时前
.c .o .a .elf .a2l hex map 这些后缀文件的互相之间的联系和作用
开发语言·elf·gcc·c/c++·a2l
ysyxg1 小时前
设计模式-策略模式
java·开发语言
一抓掉一大把1 小时前
秒杀-StackExchangeRedisHelper连接单例
java·开发语言·jvm