---是否为闰年
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