Ruby/Rails中如何比较不同日期的时间?
忽略日期判断TimeWithZone的时间区间匹配
不用折腾字符串转换,直接提取时间的当日秒数来对比是最靠谱的方式,能完全避开格式转换带来的时区或数值偏移问题。
核心思路
利用Rails为TimeWithZone提供的seconds_since_midnight方法,直接获取从当日0点到目标时间的总秒数——这个数值只和时间部分有关,完全忽略日期信息,拿来做区间判断精准又简单。
代码示例
常规区间(比如00:00-23:59)
# 提取三个时间的当日秒数 from_seconds = from.seconds_since_midnight to_seconds = to.seconds_since_midnight event_seconds = event.seconds_since_midnight # 判断event的时间是否在区间内 is_in_range = event_seconds.between?(from_seconds, to_seconds)
跨天区间(比如22:00-次日02:00)
如果你的时间区间可能跨天,只需要加个分支处理:
from_sec = from.seconds_since_midnight to_sec = to.seconds_since_midnight event_sec = event.seconds_since_midnight if from_sec <= to_sec # 正常非跨天区间 is_in_range = event_sec.between?(from_sec, to_sec) else # 跨天区间,只要event时间在from之后 或者 to之前就算符合 is_in_range = event_sec >= from_sec || event_sec <= to_sec end
为什么之前的方法会出问题
用strftime转字符串再用to_time转回的方式,会丢失原TimeWithZone的时区信息,转回的时间会默认使用本地时区,导致小时、分钟出现偏移。而seconds_since_midnight是基于原对象的时区直接计算的,完全不会有这类问题。
内容的提问来源于stack exchange,提问作者Dylan Richards
相关产品推荐
相关产品推荐

