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