模块:TimeDiff
来自RIA | Wiki
更多操作
此模块的文档可以在模块:TimeDiff/doc创建
local p = {}
-- 获取时间戳的辅助函数
local function getTimestamp(timeStr)
if not timeStr or mw.text.trim(timeStr) == '' then
timeStr = 'now'
end
timeStr = mw.text.trim(timeStr)
if string.lower(timeStr) == 'now' then
return os.time()
end
local lang = mw.language.getContentLanguage()
local success, timestamp = pcall(function()
return tonumber(lang:formatDate('U', timeStr .. '+08:00'))
end)
if success and timestamp then
return timestamp
else
return nil
end
end
function p.main(frame)
local args = frame:getParent().args
if not args['开始时间'] and not args['结束时间'] and not args['格式'] then
args = frame.args
end
local startTimeStr = args['开始时间']
local endTimeStr = args['结束时间']
local formatType = tonumber(args['格式'])
local startTs = getTimestamp(startTimeStr)
local endTs = getTimestamp(endTimeStr)
if not startTs or not endTs then
return '<span class="error">时间格式错误</span>'
end
local diff = endTs - startTs
-- 未指定格式,返回原始秒数
if not formatType then
return math.floor(diff)
end
local absDiff = math.abs(diff)
-- 基础单位计算
local totalDays = math.floor(absDiff / 86400)
local remainder = absDiff % 86400
local hours = math.floor(remainder / 3600)
remainder = remainder % 3600
local minutes = math.floor(remainder / 60)
local seconds = remainder % 60
-- 年份计算逻辑 (仅当格式 >= 5 时启用)
-- 定义 1年 = 365天
local years = 0
local days = totalDays
if formatType >= 5 then
years = math.floor(totalDays / 365)
days = totalDays % 365
end
-- 构建输出字符串
local output = ""
-- 格式5:输出年份
if formatType >= 5 then
output = output .. years .. "年"
end
-- 所有格式都有天数 (如果是格式5,这里的 days 已经是去掉了年份后的剩余天数)
output = output .. days .. "天"
-- 格式2及以上:输出小时
if formatType >= 2 then
output = output .. hours .. "小时"
end
-- 格式3及以上:输出分钟
if formatType >= 3 then
output = output .. minutes .. "分钟"
end
-- 格式4及以上:输出秒数
if formatType >= 4 then
output = output .. seconds .. "秒"
end
return output
end
return p