将Rails DateTime四舍五入到最近的15分钟间隔
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Rails DateTime四舍五入到最近的15分钟间隔相关的知识,希望对你有一定的参考价值。
我需要围绕一个DateTime
和Time
到最近的15分钟间隔。我的想法是将秒和毫秒归零(那些存在于DateTime
或Time
中吗?)甚至可能是纳秒?然后将分钟数除以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
所以我想我的问题是,如果有更好的方法来做这个,如果在DateTime
或Time
中存在毫秒和纳秒?有纳秒的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将小数添加到秒