计算DateTime与Time的小时差时触发method_missing错误,求修复方法
计算DateTime与Time对象的小时差(修复NoMethodError)
问题场景
现有代码:
pickup_time = DateTime.parse(q[:payload]["pickup_time"]) # => Wed, 24 Apr 2024 00:38:00 +0000 created_at = q[:created_at] # => Tue, 23 Apr 2024 03:53:45.874273000 UTC +00:00
需要计算pickup_time与created_at之间的小时差,执行以下代码时触发错误:
(pickup_time - q[:created_at] / 1.hour)
错误信息:
`method_missing': undefined method `/' for Tue, 23 Apr 2024 03:53:45.874273000 UTC +00:00:Time (NoMethodError)
错误原因
运算优先级错误:代码试图先对created_at(Time类型对象)执行除法操作,但Ruby的Time类并没有定义/方法,因此抛出NoMethodError。
修复方案
正确逻辑是先计算两个时间的差值,再将差值转换为小时单位,以下是两种可行写法:
1. Rails环境下写法
利用Rails提供的时长辅助方法1.hour(等价于3600秒):
(pickup_time - created_at) / 1.hour
解释:pickup_time - created_at会返回一个以秒为单位的数值,除以1.hour后得到小时差(结果为浮点数,保留小数部分)。
2. 纯Ruby环境下写法
手动转换时间类型并计算:
(pickup_time.to_time - created_at) / 3600.0
解释:先将DateTime对象pickup_time转为Time类型,相减得到秒数差,除以3600.0(用浮点数确保结果保留小数)得到小时差。
补充:获取整数小时差
如果需要向下取整的整数小时数,可调用floor方法:
((pickup_time - created_at) / 1.hour).floor
内容的提问来源于stack exchange,提问作者prajeesh
相关产品推荐
相关产品推荐

