lua日期计算

 

---是否为闰年
function TimeUtil.IsLeapYear(year)
    local b = (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0)
    return b
end

 

local m_MonthDaysMap = {
    31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
}
---某年某月有多少天
function TimeUtil.GetMonthDays(year, month)
    if 2 == month then
        if (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0) then
            return 29
        else
            return 28
        end
    else
        local days = m_MonthDaysMap[month]
        return days
    end
end

 

---根据年月日, 获取该天是这一年的第几天
function TimeUtil.GetYearDay(year, month, day)
    local yday = 0
    for i=1,month-1 do
        yday = yday + TimeUtil.GetMonthDays(year, i)
    end
    yday = yday + day
    return yday
end

 

---两个日期间隔天数
function TimeUtil.GetDeltaDaysByDate(year1, month1, day1, year2, month2, day2)
    local deltaDays = 0
    local deltaYear = year2 - year1
    if deltaYear > 0 then
        for i=1,deltaYear-1 do
            local year = year1 + i
            if TimeUtil.IsLeapYear(year) then
                deltaDays = deltaDays + 366
            else
                deltaDays = deltaDays + 365
            end
        end
        local month1LeftDays = TimeUtil.GetMonthDays(year1, month1) - day1
        local year1LeftDays = month1LeftDays
        for month=month1+1,12 do
            year1LeftDays = year1LeftDays + TimeUtil.GetMonthDays(year1, month)
        end
        local year2PassedDays = 0
        for month=1,month2-1 do
            year2PassedDays = year2PassedDays + TimeUtil.GetMonthDays(year2, month)
        end
        year2PassedDays = year2PassedDays + day2
        deltaDays = deltaDays + year1LeftDays + year2PassedDays
    else
        local deltaMonth = month2 - month1
        if deltaMonth > 0 then
            for i=1,deltaMonth-1 do
                local month = month1 + i
                deltaDays = deltaDays + TimeUtil.GetMonthDays(year1, month)
            end
            local month1LeftDays = TimeUtil.GetMonthDays(year1, month1) - day1
            deltaDays = deltaDays + month1LeftDays + day2
        else
            deltaDays = day2 - day1 --比如: 05-06, 05-08
        end
    end
    return deltaDays
end

 

---根据某年第几天, 获取月和日
function TimeUtil.YearDayToMonthAndDay(yearDay, yearHint)
    local month = 1
    local days = TimeUtil.GetMonthDays(yearHint, month)
    while yearDay > days do
        yearDay = yearDay - days
        month = month + 1
        days = TimeUtil.GetMonthDays(yearHint, month)
    end
    local day = yearDay
    return month, day
end

 

---日期加减指定天数
function TimeUtilT.DateAddDays(year, month, day, deltaDays)
    local newDay = day + deltaDays
    if deltaDays > 0 then
        local monthDays = TimeUtil.GetMonthDays(year, month)
        if newDay <= monthDays then --还没到下个月
            -- 比如: 08-30 + 1天 = 08-31
            return year, month, newDay
        end

        local monthLeftDays =  monthDays - day --本月剩余天数
        local subDays = monthLeftDays
        while deltaDays > 0 do
            deltaDays = deltaDays - subDays
            month = month + 1
            newDay = deltaDays
            if month > 12 then
                month = 1
                year = year + 1
            end

            monthDays = TimeUtil.GetMonthDays(year, month)
            if newDay <= monthDays then
                -- 比如: 08-30 + 2天 = 09-01; 08-30 + (1+30)天 = 09-30
                return year, month, newDay
            else
                -- 比如: 08-30 + (2+30)天 = 10-01
                subDays = monthDays
            end
        end
    elseif deltaDays < 0 then
        if newDay >= 1 then --还没到上个月
            -- 比如: 09-02 - 1天 = 09-01
            return year, month, newDay
        end

        local subDays = day --扣掉本月已经过的天数
        while deltaDays < 0 do
            deltaDays = deltaDays + subDays
            month = month - 1
            if month < 1 then
                month = 12
                year = year - 1
            end

            local monthDays = TimeUtil.GetMonthDays(year, month)
            newDay = monthDays + deltaDays
            if newDay >= 1 then
                -- 比如: 09-02 - 2天 = 08-31; 09-02 - (1+31)天 = 08-01
                return year, month, newDay
            else
                -- 比如: 09-02 - (2+31)天 = 07-31
                subDays = monthDays
            end
        end
    else
        return year, month, day
    end
end

 

posted @ 2025-08-31 23:15  yanghui01  阅读(14)  评论(0)    收藏  举报