Ruby中Time/Date/DateTime/带时区时间相减结果异常问题咨询
Ruby时间对象差值计算结果与预期不符的原因
复现场景
a.time_at => Mon, 12 Jul 2021 13:40:35 UTC +00:00 b.time_at => Mon, 12 Jul 2021 13:52:22 UTC +00:00 b - a => 707.0
按时间显示值计算,二者差值为11分钟余47秒,直接对两个时间对象做减法得到返回值707.0,和直观认知存在偏差。
后续类型与运算验证:
a.time_at.class => ActiveSupport::TimeWithZone b.time_at.class => ActiveSupport::TimeWithZone DateTime.parse(b.time_at.to_s) - DateTime.parse(a.time_at.to_s) => (707/86400)
产生原因
该现象不属于计算错误,本质是不同时间类的减法运算返回值单位不一致导致的认知偏差:
ActiveSupport::TimeWithZone是Rails提供的时间封装类,实例间做减法时,返回结果的单位为秒。返回值707.0就代表两个时间相差707秒,换算后恰好是11分47秒,和时间显示值计算出的差值完全一致。- Ruby原生
DateTime类实例间做减法时,返回结果的单位为天。一天总时长为86400秒,返回值707/86400代表相差707/86400天,换算成秒同样是707秒,和前一种计算结果完全等价,仅单位存在区别。
换算验证:707秒 ÷ 60 = 11分钟,剩余47秒,和两个时间的显示差值完全匹配,不存在计算逻辑错误。
内容的提问来源于stack exchange,提问作者Trip
相关产品推荐
相关产品推荐

