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 126[:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
-
PARTS_IN_SECONDS =
# File 'activesupport/lib/active_support/duration.rb', line 116{ 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 11186400 -
SECONDS_PER_HOUR =
# File 'activesupport/lib/active_support/duration.rb', line 1103600 -
SECONDS_PER_MINUTE =
# File 'activesupport/lib/active_support/duration.rb', line 10960 -
SECONDS_PER_MONTH =
# File 'activesupport/lib/active_support/duration.rb', line 113
1/12 of a gregorian year
2629746 -
SECONDS_PER_WEEK =
# File 'activesupport/lib/active_support/duration.rb', line 112604800 -
SECONDS_PER_YEAR =
# File 'activesupport/lib/active_support/duration.rb', line 114
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
-
#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
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 428
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 184
def build(value) parts = {} remainder = value.round(9) PARTS.each do |part| unless part == :seconds part_in_seconds = PARTS_IN_SECONDS[part] parts[part] = remainder.div(part_in_seconds) remainder %= part_in_seconds end end unless value == 0 parts[:seconds] = remainder 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 128
attr_accessor :value, :parts
#value (rw)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 128
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 256
def *(other) if Scalar === other || Duration === other Duration.new(value * other.value, parts.map { |type, number| [type, number * other.value] }) elsif Numeric === other Duration.new(value * other, parts.map { |type, number| [type, number * other] }) else raise_type_error(other) end end
#+(other)
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 236
def +(other) if Duration === other parts = @parts.dup other.parts.each do |(key, value)| parts[key] += value end Duration.new(value + other.value, parts) else seconds = @parts[:seconds] + other Duration.new(value + other, @parts.merge(seconds: seconds)) end end
#-(other)
# File 'activesupport/lib/active_support/duration.rb', line 251
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 267
def /(other) if Scalar === other Duration.new(value / other.value, parts.map { |type, number| [type, number / other.value] }) elsif Duration === other value / other.value elsif Numeric === other Duration.new(value / other, parts.map { |type, number| [type, 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 362
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 370
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 361
alias :from_now :since
#hash
[ GitHub ]# File 'activesupport/lib/active_support/duration.rb', line 352
def hash @value.hash 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 396
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 298
alias :kind_of? :is_a?
#since(time = ::Time.current) Also known as: #from_now, #after
[ GitHub ]#to_i
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 342
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 318
def to_s @value.to_s end
#until(time = ::Time.current)
Alias for #ago.
# File 'activesupport/lib/active_support/duration.rb', line 369
alias :until :ago