lua 修复时间戳2038溢出问题
lua 修复时间戳2038溢出问题

lua 修复时间戳2038溢出问题

基于Linux的源码(Gauss算法)

参考

https://blog.csdn.net/sinat_35170409/article/details/78881282

https://blog.csdn.net/u013073067/article/details/102977039

思路

1.计算闰年数量(%4=0 and %100 !=0)

math.floor(year/4) - math.floor(year/100) + math.floor(year/400)

2.计算 1970/01/01当前年份/01/01 的天数

719499 -> 是0001年1月1日到1970年1月1日所经历的天数

(闰年数量 + math.floor(367 * month/12) + day) + year * 365 - 719499

3.计算秒数

- 8 hour 输出我们时区(UTC+8)

(( 天数 * 24 + hour - add8 * 8) * 60 + min) * 60 + sec

代码

-- Timestamp({year=1970, month=1, day=1, hour=0, min=0, sec=0})
function Timestamp(time_tab)
    local add8 = 1  --输出时间戳格式为 UTC+8
    local year = time_tab.year
    local month = time_tab.month
    local day = time_tab.day
    local hour = time_tab.hour
    local min = time_tab.min
    local sec = time_tab.sec
    month =  month - 2
    if 0 >=  month then
        month = month + 12
        year = year - 1
    end
    return math.floor(((((math.floor(year/4) - math.floor(year/100) + math.floor(year/400) + math.floor(367 * month/12) + day)
    + year * 365 - 719499
    )*24 + hour - add8 * 8
    )*60 + min
    )*60 + sec)
end

-- TimeDiff2(os.date("%Y-%m-%d %H:%M:%S"),"2040-01-01 00:00:00")
function TimeDiff2(time_1,time_2)
    time_1 = string.gsub(string.gsub(time_1,":"," "),"-"," ")
    time_2 = string.gsub(string.gsub(time_2,":"," "),"-"," ")
    local time1 = splitStr(time_1," ")
    local time2 = splitStr(time_2," ")

    -- 1-年 2-月 3-日 4-时 5-分 6-秒
    -- print(Timestamp({year=time1[1], month=time1[2], day=time1[3], hour=time1[4], min=time1[5], sec=time1[6]}))
    -- print(Timestamp({year=time2[1], month=time2[2], day=time2[3], hour=time2[4], min=time2[5], sec=time2[6]}))
    return Timestamp({year=time2[1], month=time2[2], day=time2[3], hour=time2[4], min=time2[5], sec=time2[6]}) -
        Timestamp({year=time1[1], month=time1[2], day=time1[3], hour=time1[4], min=time1[5], sec=time1[6]})
end