Class: ActiveSupport::Duration
| Relationships & Source Files | |
| Inherits: | Object |
| Defined in: | activesupport/lib/active_support/duration.rb, activesupport/lib/active_support/duration/iso8601_parser.rb, activesupport/lib/active_support/duration/iso8601_serializer.rb |
Overview
Provides accurate date and time measurements using Date#advance and Time#advance, respectively. It mainly supports the methods on ::Numeric.
1.month.ago # equivalent to Time.now.advance(months: -1)
Constant Summary
-
PARTS =
# File 'activesupport/lib/active_support/duration.rb', line 125[:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
-
PARTS_IN_SECONDS =
# File 'activesupport/lib/active_support/duration.rb', line 115{ seconds: 1, minutes: SECONDS_PER_MINUTE, hours: SECONDS_PER_HOUR, days: SECONDS_PER_DAY, weeks: SECONDS_PER_WEEK, months: SECONDS_PER_MONTH, years: SECONDS_PER_YEAR }.freeze -
SECONDS_PER_DAY =
# File 'activesupport/lib/active_support/duration.rb', line 11086400 -
SECONDS_PER_HOUR =
# File 'activesupport/lib/active_support/duration.rb', line 1093600 -
SECONDS_PER_MINUTE =
# File 'activesupport/lib/active_support/duration.rb', line 10860 -
SECONDS_PER_MONTH =
# File 'activesupport/lib/active_support/duration.rb', line 112
1/12 of a gregorian year
2629746 -
SECONDS_PER_WEEK =
# File 'activesupport/lib/active_support/duration.rb', line 111604800 -
SECONDS_PER_YEAR =
# File 'activesupport/lib/active_support/duration.rb', line 113
length of a gregorian year (365.2425 days)
31556952
Class Method Summary
-
.build(value)
Creates a new
Durationfrom a seconds value that is converted to the individual parts: -
.parse(iso8601duration)
Creates a new
Durationfrom string formatted according to ISO 8601Duration.
Instance Attribute Summary
Instance Method Summary
-
#%(other)
Returns the modulo of this
Durationby anotherDurationor::Numeric. -
#*(other)
Multiplies this
Durationby a::Numericand returns a newDuration. -
#+(other)
Adds another
Durationor a::Numericto thisDuration. -
#-(other)
Subtracts another
Durationor a::Numericfrom thisDuration. -
#/(other)
Divides this
Durationby a::Numericand returns a newDuration. -
#<=>(other)
Compares one
Durationwith another or a::Numericto thisDuration. -
#==(other)
Returns
trueifotheris also aDurationinstance with the same #value, or ifother == value. -
#after(time = ::Time.current)
Alias for #since.
- #ago(time = ::Time.current) (also: #until, #before)
-
#before(time = ::Time.current)
Alias for #ago.
-
#eql?(other) ⇒ Boolean
Returns
trueifotheris also aDurationinstance, which has the same parts as this one. -
#from_now(time = ::Time.current)
Alias for #since.
- #hash
-
#in_days
Returns the amount of days a duration covers as a float.
-
#in_hours
Returns the amount of hours a duration covers as a float.
-
#in_minutes
Returns the amount of minutes a duration covers as a float.
-
#in_months
Returns the amount of months a duration covers as a float.
-
#in_seconds
Alias for #to_i.
-
#in_weeks
Returns the amount of weeks a duration covers as a float.
-
#in_years
Returns the amount of years a duration covers as a float.
-
#iso8601(precision: nil)
Build ISO 8601
Durationstring for this duration. -
#kind_of?(klass)
Alias for #is_a?.
- #since(time = ::Time.current) (also: #from_now, #after)
-
#to_i
(also: #in_seconds)
Returns the number of seconds that this
Durationrepresents. -
#to_s
Returns the amount of seconds a duration covers as a string.
-
#until(time = ::Time.current)
Alias for #ago.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) (private)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 477
def method_missing(method, *args, &block) value.public_send(method, *args, &block) end
Class Method Details
.build(value)
Creates a new Duration from a seconds value that is converted to the individual parts:
ActiveSupport::Duration.build(31556952).parts # => {:years=>1}
ActiveSupport::Duration.build(2716146).parts # => {:months=>1, :days=>1}
# File 'activesupport/lib/active_support/duration.rb', line 183
def build(value) unless value.is_a?(::Numeric) raise TypeError, "can't build an #{self.name} from a #{value.class.name}" end parts = {} remainder_sign = value <=> 0 remainder = value.round(9).abs PARTS.each do |part| unless part == :seconds part_in_seconds = PARTS_IN_SECONDS[part] parts[part] = remainder.div(part_in_seconds) * remainder_sign remainder %= part_in_seconds end end unless value == 0 parts[:seconds] = remainder * remainder_sign new(value, parts) end
.parse(iso8601duration)
Creates a new Duration from string formatted according to ISO 8601 Duration.
See ISO 8601 for more information. This method allows negative parts to be present in pattern. If invalid string is provided, it will raise Duration::ISO8601Parser::ParsingError.
Instance Attribute Details
#parts (rw)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 127
attr_accessor :value, :parts
#value (rw)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 127
attr_accessor :value, :parts
Instance Method Details
#%(other)
#*(other)
Multiplies this Duration by a ::Numeric and returns a new Duration.
# File 'activesupport/lib/active_support/duration.rb', line 260
def *(other) if Scalar === other || Duration === other Duration.new(value * other.value, parts.transform_values { |number| number * other.value }) elsif Numeric === other Duration.new(value * other, parts.transform_values { |number| number * other }) else raise_type_error(other) end end
#+(other)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 241
def +(other) if Duration === other parts = @parts.merge(other.parts) do |_key, value, other_value| value + other_value end Duration.new(value + other.value, parts) else seconds = @parts.fetch(:seconds, 0) + other Duration.new(value + other, @parts.merge(seconds: seconds)) end end
#-(other)
# File 'activesupport/lib/active_support/duration.rb', line 255
def -(other) self + (-other) end
#/(other)
Divides this Duration by a ::Numeric and returns a new Duration.
# File 'activesupport/lib/active_support/duration.rb', line 271
def /(other) if Scalar === other Duration.new(value / other.value, parts.transform_values { |number| number / other.value }) elsif Duration === other value / other.value elsif Numeric === other Duration.new(value / other, parts.transform_values { |number| number / other }) else raise_type_error(other) end end
#<=>(other)
#==(other)
Returns true if other is also a Duration instance with the same #value, or if other == value.
#after(time = ::Time.current)
Alias for #since.
# File 'activesupport/lib/active_support/duration.rb', line 413
alias :after :since
#ago(time = ::Time.current) Also known as: #until, #before
[ GitHub ]#before(time = ::Time.current)
Alias for #ago.
# File 'activesupport/lib/active_support/duration.rb', line 421
alias :before :ago
#eql?(other) ⇒ Boolean
Returns true if other is also a Duration instance, which has the same parts as this one.
#from_now(time = ::Time.current)
Alias for #since.
# File 'activesupport/lib/active_support/duration.rb', line 412
alias :from_now :since
#hash
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 403
def hash @value.hash end
#in_days
Returns the amount of days a duration covers as a float
12.hours.in_days # => 0.5
# File 'activesupport/lib/active_support/duration.rb', line 372
def in_days in_seconds / SECONDS_PER_DAY.to_f end
#in_hours
Returns the amount of hours a duration covers as a float
1.day.in_hours # => 24.0
# File 'activesupport/lib/active_support/duration.rb', line 365
def in_hours in_seconds / SECONDS_PER_HOUR.to_f end
#in_minutes
Returns the amount of minutes a duration covers as a float
1.day.in_minutes # => 1440.0
# File 'activesupport/lib/active_support/duration.rb', line 358
def in_minutes in_seconds / SECONDS_PER_MINUTE.to_f end
#in_months
Returns the amount of months a duration covers as a float
9.weeks.in_months # => 2.07
# File 'activesupport/lib/active_support/duration.rb', line 386
def in_months in_seconds / SECONDS_PER_MONTH.to_f end
#in_seconds
Alias for #to_i.
# File 'activesupport/lib/active_support/duration.rb', line 353
alias :in_seconds :to_i
#in_weeks
Returns the amount of weeks a duration covers as a float
2.months.in_weeks # => 8.696
# File 'activesupport/lib/active_support/duration.rb', line 379
def in_weeks in_seconds / SECONDS_PER_WEEK.to_f end
#in_years
Returns the amount of years a duration covers as a float
30.days.in_years # => 0.082
# File 'activesupport/lib/active_support/duration.rb', line 393
def in_years in_seconds / SECONDS_PER_YEAR.to_f end
#iso8601(precision: nil)
Build ISO 8601 Duration string for this duration. The precision parameter can be used to limit seconds’ precision of duration.
# File 'activesupport/lib/active_support/duration.rb', line 446
def iso8601(precision: nil) ISO8601Serializer.new(self, precision: precision).serialize end
#kind_of?(klass)
Alias for #is_a?.
# File 'activesupport/lib/active_support/duration.rb', line 306
alias :kind_of? :is_a?
#since(time = ::Time.current) Also known as: #from_now, #after
[ GitHub ]#to_i Also known as: #in_seconds
Returns the number of seconds that this Duration represents.
1.minute.to_i # => 60
1.hour.to_i # => 3600
1.day.to_i # => 86400
Note that this conversion makes some assumptions about the duration of some periods, e.g. months are always 1/12 of year and years are 365.2425 days:
# equivalent to (1.year / 12).to_i
1.month.to_i # => 2629746
# equivalent to 365.2425.days.to_i
1.year.to_i # => 31556952
In such cases, Ruby’s core Date and Time should be used for precision date and time arithmetic.
# File 'activesupport/lib/active_support/duration.rb', line 350
def to_i @value.to_i end
#to_s
Returns the amount of seconds a duration covers as a string. For more information check to_i method.
1.day.to_s # => "86400"
# File 'activesupport/lib/active_support/duration.rb', line 326
def to_s @value.to_s end
#until(time = ::Time.current)
Alias for #ago.
# File 'activesupport/lib/active_support/duration.rb', line 420
alias :until :ago