将Rails DateTime四舍五入到最近的15分钟间隔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Rails DateTime四舍五入到最近的15分钟间隔相关的知识,希望对你有一定的参考价值。

我需要围绕一个DateTimeTime到最近的15分钟间隔。我的想法是将秒和毫秒归零(那些存在于DateTimeTime中吗?)甚至可能是纳秒?然后将分钟数除以15,然后将结果乘以15并将其设置为分钟:

# zero out the seconds
time -= time.sec.seconds
# zero out the milliseconds (does that exist?)
# zero out the nanoseconds (less likely this exists)

minutes_should_be = (time.min / 15.to_f).round * 15
time += (minutes_should_be - time.min).minutes

所以我想我的问题是,如果有更好的方法来做这个,如果在DateTimeTime中存在毫秒和纳秒?有纳秒的nsec方法,但我认为这是自纪元以来的总纳秒。

答案

以下应该做的伎俩:

##
# rounds a Time or DateTime to the neares 15 minutes
def round_to_15_minutes(t)
  rounded = Time.at((t.to_time.to_i / 900.0).round * 900)
  t.is_a?(DateTime) ? rounded.to_datetime : rounded
end

该函数将输入转换为Time对象,该对象可以使用to_i转换为自纪元以来的秒数(这会自动剥离纳米/毫秒)。然后我们将15分钟(900秒)除以得到的浮子。这会自动将时间四舍五入到最近的15分钟。现在,我们只需将结果乘以15分钟,然后再将其转换为(日期)时间。

Example values:

round_to_15_minutes Time.new(2013, 9, 13, 0, 7, 0, "+02:00")
#=> 2013-09-13 00:00:00 +0200
round_to_15_minutes Time.new(2013, 9, 13, 0, 8, 0, "+02:00")
#=> 2013-09-13 00:15:00 +0200
round_to_15_minutes Time.new(2013, 9, 13, 0, 22, 29, "+02:00")
#=> 2013-09-13 00:15:00 +0200
round_to_15_minutes Time.new(2013, 9, 13, 0, 22, 30, "+02:00")
#=> 2013-09-13 00:30:00 +0200
round_to_15_minutes DateTime.now
#=> #<DateTime: 2013-09-13T01:00:00+02:00 ((2456548j,82800s,0n),+7200s,2299161j)>
另一答案

我认为这会奏效

def nearest15 minutes
  ((minutes / 60.0 * 4).round / 4.0 * 60).to_i
end

这个想法是

  • 按小时(小数)计算你的分钟数
  • 四舍五入到最近的一刻
  • 转换回分钟

一些样本输出

10.times do
  n = [*1..200].sample
  puts "%d => %d" % [n, nearest15(n)]
end

产量

85 => 90
179 => 180
54 => 60
137 => 135
104 => 105
55 => 60
183 => 180
184 => 180
46 => 45
92 => 90
另一答案

基于Tessi的答案,DateTime的通用舍入解决方案:

class DateTime

  def round(granularity=1.hour)
    Time.at((self.to_time.to_i/granularity).round * granularity).to_datetime
  end

end

用法示例:

DateTime.now.round 15.minutes
> Fri, 15 May 2015 11:15:00 +0100

以上是关于将Rails DateTime四舍五入到最近的15分钟间隔的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails Ransack Datetime 到日期搜索

Rails jbuilder DateTime将小数添加到秒

将分钟向下舍入到最接近的一刻钟

在 AWS 红移中将日期时间列四舍五入到最近的小时

Rails ActiveRecord,其中datetime不起作用

SQL函数将日期四舍五入到最近的月份