模块:TimeDiff
来自RIA | Wiki
更多操作
此模块的文档可以在模块:TimeDiff/doc创建
local p = {}
-- 获取时间戳的辅助函数
-- 逻辑完全复刻原模板:
-- 1. 如果输入是 'now',直接使用当前服务器时间
-- 2. 如果是具体时间字符串,末尾添加 +08:00 (模拟北京时间/CST输入)
local function getTimestamp(timeStr)
-- 处理空值,默认为 'now'
if not timeStr or mw.text.trim(timeStr) == '' then
timeStr = 'now'
end
timeStr = mw.text.trim(timeStr)
-- 检查是否为 'now' (不区分大小写)
if string.lower(timeStr) == 'now' then
return os.time()
end
-- 按照原模板逻辑,非 now 的时间字符串默认视为 UTC+8
-- 通过 mw.language 处理时间解析
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
-- 如果解析失败(例如格式极度不规范),返回当前时间或报错
-- 为了健壮性,这里返回 nil,在主函数处理错误
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['格式']) -- 如果未传入或非数字,则为 nil
-- 计算时间戳
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 days = 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
-- 构建输出字符串
local output = days .. "天"
if formatType >= 2 then
output = output .. hours .. "小时"
end
if formatType >= 3 then
output = output .. minutes .. "分钟"
end
if formatType >= 4 then
output = output .. seconds .. "秒"
end
return output
end
return p