如何在Julia中从字符串解析duration类型?及类型选型建议
Julia中配置文件时长解析的合理方案
一、时长类型选择建议
结合你需要处理小时+分钟时长的场景,优先选用Dates.CompoundPeriod,核心原因:
- 能直接保留「小时+分钟」的语义结构,可读性远优于单一的
Millisecond或总分钟数 - 原生支持和
DateTime对象做加减运算,无需额外转换 - 调试时输出清晰,可直观看到原始时长的组成
如果后续需要精确总毫秒数,也可以从CompoundPeriod快速转换:
cp = CompoundPeriod(Hour(9), Minute(30)) total_ms = Millisecond(cp) # 得到 Millisecond(34200000)
二、针对不同输入格式的解析实现
1. 解析"09:30"(小时:分钟)格式
using Dates function parse_duration_hhmm(s::AbstractString) h, m = parse.(Int, split(s, ":")) return CompoundPeriod(Hour(h), Minute(m)) end # 使用示例 parse_duration_hhmm("09:30") # 返回 CompoundPeriod([Hour(9), Minute(30)])
2. 解析"9h30"(带单位缩写)格式
用正则匹配数字和单位:
function parse_duration_abbr(s::AbstractString) periods = [] regex = r"(\d+)([hm])" # 匹配数字+h(小时)/m(分钟)的组合 for match in eachmatch(regex, s) num = parse(Int, match[1]) unit = match[2] push!(periods, unit == "h" ? Hour(num) : Minute(num)) end return CompoundPeriod(periods) end # 使用示例 parse_duration_abbr("9h30") # 返回 CompoundPeriod([Hour(9), Minute(30)])
3. 兼容多种格式的统一解析函数
合并上述逻辑,自动识别输入格式:
function parse_duration(s::AbstractString) if ':' in s return parse_duration_hhmm(s) elseif occursin(r"[hm]", s) return parse_duration_abbr(s) else error("不支持的时长格式,请使用\"hh:mm\"或\"XhYm\"格式") end end
三、三种常见时长类型的场景对比
Dates.Millisecond:适合需要精确总时长计算的场景,但丢失原始语义,用户输入体验差- 单一
Period(如总Minute):比Millisecond可读性稍好,但无法保留「小时+分钟」的拆分结构 Dates.CompoundPeriod:完全匹配你的需求,兼顾用户输入友好性和语义保留,是最优选择
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

