如何在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(毫秒)
代码说明
- 前缀处理:用
string.gsub去掉开头的PT标识,这是ISO 8601时长格式中时间部分的固定前缀 - 提取数值与单位:通过
string.match匹配出数字(包含小数点)和时间单位,这里我们只聚焦你需要的秒(S)单位 - 类型转换与返回:把字符串数值转成Lua数字后,根据
returnMs布尔参数决定返回原始秒数,还是乘以1000得到毫秒数 - 错误处理:如果传入的格式不符合预期(比如不是秒单位),会抛出明确的错误提示
扩展建议
如果之后需要支持分钟(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
相关产品推荐
相关产品推荐

