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

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

模块:TimeDiff:修订间差异

来自RIA | Wiki
BCMonomial留言 | 贡献
无编辑摘要
BCMonomial留言 | 贡献
无编辑摘要
 
第44行: 第44行:
     local diff = endTs - startTs
     local diff = endTs - startTs


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


    -- 准备计算格式化时间,使用绝对值
     local absDiff = math.abs(diff)
     local absDiff = math.abs(diff)
   
    -- 基础单位计算
     local totalDays = math.floor(absDiff / 86400)
     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 remainder = absDiff % 86400
      
      
第61行: 第69行:
     local seconds = remainder % 60
     local seconds = remainder % 60


     -- 年份计算逻辑 (仅当格式 >= 5 时启用)
     -- 构建输出字符串 (格式 1-4)
    -- 定义 1年 = 365天
     local output = totalDays .. "天"
    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
     if formatType >= 2 then
         output = output .. hours .. "小时"
         output = output .. hours .. "小时"
     end
     end
      
      
    -- 格式3及以上:输出分钟
     if formatType >= 3 then
     if formatType >= 3 then
         output = output .. minutes .. "分钟"
         output = output .. minutes .. "分钟"
     end
     end
      
      
    -- 格式4及以上:输出秒数
     if formatType >= 4 then
     if formatType >= 4 then
         output = output .. seconds .. "秒"
         output = output .. seconds .. "秒"

2025年11月24日 (一) 16:31的最新版本

此模块的文档可以在模块: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