打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

目前wiki关闭了自行注册账号的功能,如需注册账号,请查阅Help:注册账号

模块: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

    -- 情况0:未指定格式,返回原始秒数(带正负号)
    if not formatType then
        return math.floor(diff)
    end

    -- 准备计算格式化时间,使用绝对值
    local absDiff = math.abs(diff)
    local totalDays = math.floor(absDiff / 86400)

    -- 情况5:特殊处理,仅输出 年+天
    if formatType == 5 then
        local years = math.floor(totalDays / 365)
        local days = totalDays % 365
        return years .. "年" .. days .. "天"
    end

    -- 情况1-4:常规处理
    local remainder = absDiff % 86400
    
    local hours = math.floor(remainder / 3600)
    remainder = remainder % 3600
    
    local minutes = math.floor(remainder / 60)
    local seconds = remainder % 60

    -- 构建输出字符串 (格式 1-4)
    local output = totalDays .. "天"
    
    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