如何提取ISO 8601格式时间的hh:mm并完成分钟数的加减运算
优化方案
1. 更鲁棒的hh:mm提取方法
原有的子串截取法在固定ISO 8601格式的场景下可正常运行,改用正则匹配的兼容性更强,不会因为日期部分格式变动出现下标错位问题:
local isoStr = "2021-09-28T12:00:00-05:00" -- 直接匹配T字符后的时分部分 local hhmm = isoStr:match("T(%d%d:%d%d)") print(hhmm) -- 输出 12:00
2. 分钟加减最优实现
不需要拆分做复杂的进位借位判断,统一转换成「当天总分钟数」做运算,最后再格式化为hh:mm即可,逻辑简洁且不易出边界错误:
-- 工具函数:将hh:mm格式字符串转为当天总分钟数 local function hhmmToMinutes(hhmm) local h, m = hhmm:match("(%d%d):(%d%d)") return tonumber(h) * 60 + tonumber(m) end -- 工具函数:将当天总分钟数转为hh:mm格式字符串 local function minutesToHhmm(totalMinutes) -- 模1440处理跨天的正负偏移情况 totalMinutes = totalMinutes % (24 * 60) local h = math.floor(totalMinutes / 60) local m = totalMinutes % 60 return string.format("%02d:%02d", h, m) end -- 示例:给提取到的12:00减90分钟 local originHhmm = isoStr:match("T(%d%d:%d%d)") local originMin = hhmmToMinutes(originHhmm) -- 减90分钟,加偏移直接替换为+号即可 local newMin = originMin - 90 local newHhmm = minutesToHhmm(newMin) print(newHhmm) -- 输出 10:30
该方案可完全替代原有OpenMath函数逻辑,无需处理复杂的条件判断,跨天、正负偏移场景都能自动适配。
内容的提问来源于stack exchange,提问作者Brannan Holland
相关产品推荐
相关产品推荐

