You said “round down”, so I’m not sure if you’re actually looking for the round or the floor, but here’s the code to do both. I think something like this reads really well if you add round_off
and floor
methods to the Time class. The added benefit is that you can more easily round by any time partition.
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
Note: ActiveSupport was only necessary for the pretty 15.minutes
argument. If you don’t want that dependency, use 15 * 60
instead.