ActiveSupport Duration
When needing to dynamically add or subtract different times and units from a DateTime, you might need to create a Duration. Below you will find short code snippets highlighting how.
Adding Seconds
Let’s consider adding 100 seconds to a date.
total_seconds = 100
date = DateTime.parse('2010-02-01')
=> Mon, 01 Feb 2010 00:00:00 +0000
Adding the integer will use the unit days not seconds.
date + total_seconds
=> Mon, 01 Feb 2010 00:01:40 +0000
A common rails idiom is to use the class Numeric’s instance method seconds.
date + total_seconds.seconds
=> Mon, 01 Feb 2010 00:01:40 +0000
If you trace the source code (rails 5.2.1) you will find that .seconds calls the class method seconds on ActiveSupport::Duration. That class method does the following:
def self.seconds(value)
new(value, [[:seconds, value]])
end
In Short
Instead of using #seconds or #days via the Numeric class, you can create a duration by instantiating ActiveSupport::Duration.
ActiveSupport::Duration.new(100, [[:seconds, 100]])
=> 100 seconds
ActiveSupport::Duration.new(100, { seconds: 100 })
=> 100 seconds
ActiveSupport::Duration.new(5, { months: 5, days: 2 })
=> 5 months and 2 days
ActiveSupport::Duration.new(5, { months: 5, seconds: 4, years: 3, days: 2 })
=> 3 years, 5 months, 2 days, and 4 seconds
Found this useful? Have a suggestion? Get in touch at blog@hocnest.com.