使用Julia的Dates.jl包无法相加两个Time类型组件的问题求助
Time类型不能直接相加? 这个错误其实很好理解——Time类型代表的是一天中的某个具体时刻,就像“早上7点30分”或者“下午2点15分”,它不是用来表示时间段(比如“30分钟”“1小时”)的。你想想,把两个具体时刻直接加起来逻辑上就说不通,比如“7点30分 + 8点15分”能得到什么?所以Julia的Dates.jl包根本没有实现两个Time对象相加的方法,这就是你看到MethodError的原因。
先还原一下你的代码和报错信息:
你的代码
using Dates t1 = Time(00,30,18) t2 = Time(00,40,42) t1 + t2
报错信息
ERROR: MethodError: no method matching +(::Time, ::Time)
Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...) at operators.jl:560
+(::StridedArray{var"#s832", N} where {var"#s832"<:Union{Dates.CompoundPeriod, Period}, N}, ::TimeType) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Dates/src/deprecated.jl:10
+(::Period, ::TimeType) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Dates/src/arithmetic.jl:85
...
Stacktrace: [1] top-level scope @ REPL[5]:1
解决方法:根据你的需求选择合适的方式
如果你的目标是计算这两个Time代表的总时长(比如30分18秒 + 40分42秒),需要先把Time转换成表示时间段的类型(比如Period或CompoundPeriod),再进行操作:
方法1:转成秒数相加,再转回时间格式
using Dates t1 = Time(00,30,18) t2 = Time(00,40,42) # 把两个Time对象转成总秒数相加 total_seconds = Dates.value(Dates.Second(t1)) + Dates.value(Dates.Second(t2)) # 从0点开始加上总秒数,得到合并后的时间(超过一天会自动取模) result = Time(0) + Second(total_seconds) # 输出结果:01:11:00
方法2:转成复合时间段(CompoundPeriod)相加
using Dates t1 = Time(00,30,18) t2 = Time(00,40,42) # 将Time拆分为时、分、秒的复合时间段 cp1 = CompoundPeriod(Hour(t1), Minute(t1), Second(t1)) cp2 = CompoundPeriod(Hour(t2), Minute(t2), Second(t2)) # 直接相加得到总时间段 total_period = cp1 + cp2 # 输出结果:1 hour, 11 minutes, 0 seconds # 如果需要转回Time格式,同样用0点加上这个时间段 result_time = Time(0) + total_period
如果你的需求是某个时刻加上另一个Time代表的时长(比如t1这个时刻,加上t2对应的40分42秒),可以直接把t2拆成时间段再相加:
t1 + Minute(t2) + Second(t2) # 或者更简洁的方式 t1 + CompoundPeriod(Minute(t2), Second(t2))
内容的提问来源于stack exchange,提问作者imantha

