1. 程式人生 > >lua計算時間差 按照日曆方式來計算時間差 而不是固定每個月都是多少天來計算

lua計算時間差 按照日曆方式來計算時間差 而不是固定每個月都是多少天來計算

data_GetIntervalTimeTableFromOldTimeToNewTime 方法剛寫的,正在驗證中,如果發現了bug歡迎反饋,以便及時修正

--獲取月份對應的天數
local DaysNormalMonth = {[1] = 31, [2] = nil, [3] = 31, [4] = 30, [5] = 31, [6] = 30, [7] = 31, [8] = 31, [9] = 30, [10] = 31, [11] = 30, [12] = 31}
function getDaysWithMonth( month, year )
if month == 2 then
if (year%4 == 0 and year % 100 ~= 0) or (year % 100 == 0 and year % 400 == 0) then
return 29
else
return 28
end
else
return DaysNormalMonth[month]
end
end

--根據新舊時間 獲取時間間隔(只算到分鐘數,不考慮秒數)
--獲取的是日曆上的時間差,而不是固定每個月都是多少天來計算 
--比如2016/04/02 與 2016/02/28 之間的間隔應該是1個月3天 
function data_GetIntervalTimeTableFromOldTimeToNewTime(oldTime, newTime)
-- local wantTime = os.time({year=2014,month=12,day=31,hour=1,min=1})
-- print(wantTime)
-- print("舊時間=", os.date("%Y-%m-%d %H:%M", oldTime))
-- print("新時間=", os.date("%Y-%m-%d %H:%M", newTime))
local temp = 0
--引數位置錯了
if oldTime > newTime then
temp = oldTime
oldTime = newTime
newTime = temp
end
local oldTimeTable = os.date("*t", oldTime)
local newTimeTable = os.date("*t", newTime)


local oldYear = oldTimeTable.year
local oldMonth = oldTimeTable.month
local oldDay = oldTimeTable.day
local oldHour = oldTimeTable.hour
local oldMin = oldTimeTable.min


local newYear = newTimeTable.year
local newMonth = newTimeTable.month
local newDay = newTimeTable.day
local newHour = newTimeTable.hour
local newMin = newTimeTable.min


--求差值
local subYear = newYear  - oldYear
local subMonth = newMonth - oldMonth
local subDay = newDay   - oldDay
local subHour = newHour  - oldHour
local subMin = newMin   - oldMin


--取得實際月份是多少天 (考慮了潤年)
local oldMonthDays = getDaysWithMonth(oldMonth, oldYear)
local newMonthDays = getDaysWithMonth(newMonth,  newYear)


local yearNum = 0
local monthNum = 0 
local dayNum = 0
local hourNum = 0
local minNum = 0


local yearSubNum = 0
local monthSubNum = 0
local daySubNum = 0
local hourSubNum = 0


--如果分鐘數小於0
if subMin < 0 then
minNum = 60 - math.abs(subMin) -- 用60來減掉分鐘
hourSubNum = hourSubNum - 1
else
minNum = subMin
end


--如果小時數小於0
if subHour < 0 or hourSubNum < 0 then
if (subHour + hourSubNum) < 0 then
hourNum = 24 - math.abs(subHour) + hourSubNum
daySubNum = daySubNum - 1
else
hourNum = subHour + hourSubNum
end
else
hourNum = subHour
end


--如果天數小於0 可能會月份不同天 以以前的月份天數進行計算
if subDay < 0 or daySubNum < 0 then
if (subDay + daySubNum) < 0 then
dayNum = oldMonthDays - math.abs(subDay) + daySubNum
monthSubNum = monthSubNum - 1
else
dayNum = subDay + daySubNum
end
else
dayNum = subDay
end


--如果月數小於0
if subMonth < 0 or monthSubNum < 0 then
if (subMonth + monthSubNum) < 0 then
monthNum = 12 - math.abs(subMonth) + monthSubNum
yearSubNum = yearSubNum - 1
else
monthNum = subMonth + monthSubNum
end
else
monthNum = subMonth
end


yearNum = subYear


--如果年數小於0
if yearSubNum < 0 then
yearNum = yearNum + yearSubNum
end


--多餘的檢測 開始
--檢測是否符合規則
--以下是為了避免太離奇的結果,新方法需要時間來檢測效果(先註釋掉)
--[[
local isTrueValue = true
if yearNum < 0 then
yearNum = 0
isTrueValue = false
end


if monthNum < 0 then
monthNum = 0
isTrueValue = false
end


if monthNum > 12 then
monthNum = 12
isTrueValue = false
end


if dayNum < 0 then
dayNum = 0
isTrueValue = false
end


if dayNum > 31 then
dayNum = 31
isTrueValue = false
end


if hourNum < 0 then
hourNum = 0
isTrueValue = false
end


if hourNum > 24 then
hourNum = 24
isTrueValue = false
end


if minNum < 0 then
minNum = 0
isTrueValue = false
end


if minNum > 60 then
minNum = 60
isTrueValue = false
end


if not isTrueValue then
logError("data_GetIntervalTimeTableFromOldTimeToNewTime 日期的計算有錯")
end
--]]


--多餘的檢測 結束


--得到最後時間
local intervalTiemTable = {}
intervalTiemTable.year = yearNum
intervalTiemTable.month = monthNum
intervalTiemTable.day = dayNum
intervalTiemTable.hour = hourNum
intervalTiemTable.min = minNum


return intervalTiemTable
end