有没有一种简单的方法将时间四舍五入到最近的15分钟?
这就是我目前正在做的事情。有没有更简单的方法呢?
t = Time.new
rounded_t = Time.local(t.year, t.month, t.day, t.hour, t.min/15*15)
发布于 2010-11-15 16:45:53
我想我应该发布另一个解决方案,提供向上和向下舍入到给定的最接近的秒数。哦,而且这不会像其他一些解决方案那样改变时区。
class Time
def round(sec=1)
down = self - (self.to_i % sec)
up = down + sec
difference_down = self - down
difference_up = up - self
if (difference_down < difference_up)
return down
else
return up
end
end
end
t = Time.now # => Mon Nov 15 10:18:29 +0200 2010
t.round(15.minutes) # => Mon Nov 15 10:15:00 +0200 2010
t.round(20.minutes) # => Mon Nov 15 10:20:00 +0200 2010
t.round(60.minutes) # => Mon Nov 15 10:00:00 +0200 2010
在x.minutes特性的示例中使用了ActiveSupport。您可以使用15 * 60。
基于该方案可以很容易地实现floor和ceil方法。
发布于 2013-06-15 05:05:36
我找到了一个可读性很强的解决方案;
这将使您的时间四舍五入到最后15分钟。您可以将15.minutes
更改为所有可能的时间刻度。
Time.at(Time.now.to_i - (Time.now.to_i % 15.minutes))
发布于 2015-05-08 00:54:33
我编写了Rounding gem来处理这类情况。
向下舍入时间就像在时间上调用floor_to
一样简单。还支持向上舍入和舍入到最近的值(ceil_to
和round_to
)。
require "rounding"
Time.current.floor_to(15.minutes) # => Thu, 07 May 2015 16:45:00 UTC +00:00
Time.current.ceil_to(15.minutes) # => Thu, 07 May 2015 17:00:00 UTC +00:00
Time.current.round_to(15.minutes) # => Thu, 07 May 2015 16:45:00 UTC +00:00
保留原始时间的时区(本例中为UTC)。你不需要加载ActiveSupport --你可以写floor_to(15*60)
,它会工作的很好。gem使用Rational数字来避免舍入误差。您可以通过提供偏移量round_to(1.week, Time.parse("2015-5-4 00:00:00 UTC"))
来舍入到最近的星期一。我们在生产中使用它。
我写了一个blog post来解释更多。希望这对你有帮助。
https://stackoverflow.com/questions/449271
复制相似问题