You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lua中将ISO 8601时长转为秒/毫秒?是否有内置库?

解析ISO 8601时长到秒/毫秒的Lua实现

嘿,好问题!Lua的标准库确实没有直接支持ISO 8601时长格式解析的内置函数,所以你得自己写个解析函数来处理这类格式(比如PT1S、PT0.010S、PT0.001S)。下面给你一个针对你需求的实现,还能灵活切换返回秒或毫秒:

实现代码

function parseISO8601Duration(durationStr, returnMs)
    -- 移除ISO 8601时长的PT前缀(P=周期,T=时间部分)
    local numStr = string.gsub(durationStr, "^PT", "")
    -- 提取数字部分(支持整数和小数)与时间单位
    local value, unit = string.match(numStr, "([%d%.]+)(%a)")
    
    -- 仅处理秒单位的情况,如需扩展其他单位可添加判断
    if not value or unit ~= "S" then
        error("Unsupported duration format or unit: " .. durationStr)
    end
    
    local seconds = tonumber(value)
    -- 根据参数决定返回秒还是毫秒
    return returnMs and (seconds * 1000) or seconds
end

-- 测试示例
print(parseISO8601Duration("PT1S"))          --> 输出 1(秒)
print(parseISO8601Duration("PT0.010S"))     --> 输出 0.01(秒)
print(parseISO8601Duration("PT0.001S", true)) --> 输出 1(毫秒)

代码说明

  1. 前缀处理:用string.gsub去掉开头的PT标识,这是ISO 8601时长格式中时间部分的固定前缀
  2. 提取数值与单位:通过string.match匹配出数字(包含小数点)和时间单位,这里我们只聚焦你需要的秒(S)单位
  3. 类型转换与返回:把字符串数值转成Lua数字后,根据returnMs布尔参数决定返回原始秒数,还是乘以1000得到毫秒数
  4. 错误处理:如果传入的格式不符合预期(比如不是秒单位),会抛出明确的错误提示

扩展建议

如果之后需要支持分钟(M)、小时(H)甚至天(D)等其他ISO 8601时长单位,可以扩展函数里的单位判断逻辑,比如:

-- 示例:添加分钟和小时的支持
local unitMultipliers = {
    S = 1,
    M = 60,
    H = 3600
}

-- 在函数里替换单位判断部分:
if not value or not unitMultipliers[unit] then
    error("Unsupported duration format or unit: " .. durationStr)
end

local seconds = tonumber(value) * unitMultipliers[unit]

这样就能处理PT2M(2分钟=120秒)、PT1H30M(1.5小时=5400秒)这类格式了。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:17