有一种简单的方法可以将时间缩短到最近的15分钟吗?
这就是我目前正在做的事情.有更简单的方法吗?
t = Time.new rounded_t = Time.local(t.year, t.month, t.day, t.hour, t.min/15*15)
Ryan McGeary.. 127
你说"向下",所以我不确定你是否真的在寻找圆形或地板,但这里是两个代码.如果你向Time类添加round_off
和floor
方法,我认为这样的东西读得很好.额外的好处是您可以更容易地随时分区.
require 'active_support/core_ext/numeric' # from gem 'activesupport' class Time # Time#round already exists with different meaning in Ruby 1.9 def round_off(seconds = 60) Time.at((self.to_f / seconds).round * seconds).utc end def floor(seconds = 60) Time.at((self.to_f / seconds).floor * seconds).utc end end t = Time.now # => Thu Jan 15 21:26:36 -0500 2009 t.round_off(15.minutes) # => Thu Jan 15 21:30:00 -0500 2009 t.floor(15.minutes) # => Thu Jan 15 21:15:00 -0500 2009
注意: ActiveSupport仅用于pretty 15.minutes
参数.如果您不想要该依赖项,请15 * 60
改用.
你说"向下",所以我不确定你是否真的在寻找圆形或地板,但这里是两个代码.如果你向Time类添加round_off
和floor
方法,我认为这样的东西读得很好.额外的好处是您可以更容易地随时分区.
require 'active_support/core_ext/numeric' # from gem 'activesupport' class Time # Time#round already exists with different meaning in Ruby 1.9 def round_off(seconds = 60) Time.at((self.to_f / seconds).round * seconds).utc end def floor(seconds = 60) Time.at((self.to_f / seconds).floor * seconds).utc end end t = Time.now # => Thu Jan 15 21:26:36 -0500 2009 t.round_off(15.minutes) # => Thu Jan 15 21:30:00 -0500 2009 t.floor(15.minutes) # => Thu Jan 15 21:15:00 -0500 2009
注意: ActiveSupport仅用于pretty 15.minutes
参数.如果您不想要该依赖项,请15 * 60
改用.
我不太熟悉ruby的语法,但你可以使用modulo 向下舍入到最接近的15分钟.(即x - (x modulo 15)).我猜想语法会是这样的
t.min - ( t.min % 15)
这将使您的可能值集合为0,15,30和45.假设0 <= t.min <= 59.
我想我会发布另一个解决方案,提供向上和向下舍入到最接近的秒数.哦,这并没有像其他一些解决方案那样改变时区.
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代替.
基于该解决方案,可以容易地实现地板和天花板.
由于Ruby允许Times上的算术(以秒为单位),你可以这样做:
t = Time.new rounded_t = t-t.sec-t.min%15*60
我写了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"))
.我们在生产中使用它.
我写了一篇博文,解释了更多内容.希望你觉得它有用.
我找到了一个非常易读的解决方
这会将你的时间缩短到最后的15分钟.您可以更改15.minutes
为每个时间刻度.
Time.at(Time.now.to_i - (Time.now.to_i % 15.minutes))
你可以这样做:
Time.at(t.to_i/(15*60)*(15*60))