класс ActiveSupport::Duration
Обеспечивает точные измерения даты и времени, используя Date#advance и Time#advance соответственно. В основном поддерживает методы для Numeric.
1.month.ago # equivalent to Time.now.advance(months: -1)
Константы
- PARTS
- PARTS_IN_SECONDS
- СЕКУНДЫ_В_СУТКИ
- СЕКУНДЫ_В_ЧАС
- СЕКУНДЫ_В_МИНУТУ
- СЕКУНДЫ_В_МЕСЯЦ
- СЕКУНДЫ_В_НЕДЕЛЮ
- СЕКУНДЫ_В_ГОД
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/duration.rb, line 183
def build(value)
parts = {}
remainder = value.to_f
PARTS.each do |part|
unless part == :seconds
part_in_seconds = PARTS_IN_SECONDS[part]
parts[part] = remainder.div(part_in_seconds)
remainder = (remainder % part_in_seconds).round(9)
end
end
parts[:seconds] = remainder
new(value, parts)
end Создаёт новый Duration из значения в секундах, преобразованного в отдельные части:
ActiveSupport::Duration.build(31556952).parts # => {:years=>1}
ActiveSupport::Duration.build(2716146).parts # => {:months=>1, :days=>1}
# File activesupport/lib/active_support/duration.rb, line 138 def parse(iso8601duration) parts = ISO8601Parser.new(iso8601duration).parse! new(calculate_total_seconds(parts), parts) end
Создаёт новый Duration из строки, отформатированной согласно ISO 8601 Duration.
См. ISO 8601 для получения дополнительной информации. Этот метод позволяет иметь отрицательные части в шаблоне. Если строка недействительна, будет вызвано исключение ActiveSupport::Duration::ISO8601Parser::ParsingError.
Общедоступные методы экземпляра
# File activesupport/lib/active_support/duration.rb, line 283
def %(other)
if Duration === other || Scalar === other
Duration.build(value % other.value)
elsif Numeric === other
Duration.build(value % other)
else
raise_type_error(other)
end
end Возвращает остаток от деления этого продолжительности на другую продолжительность или число. Значения чисел обрабатываются как секунды.
# File activesupport/lib/active_support/duration.rb, line 258
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 Умножает эту продолжительность на число и возвращает новую продолжительность.
# File activesupport/lib/active_support/duration.rb, line 238
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 Добавляет другую продолжительность или число к этой продолжительности. Значения чисел обрабатываются как секунды.
# File activesupport/lib/active_support/duration.rb, line 253 def -(other) self + (-other) end
Вычитает другую продолжительность или число из этой продолжительности. Значения чисел обрабатываются как секунды.
# File activesupport/lib/active_support/duration.rb, line 269
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 Делит эту продолжительность на число и возвращает новую продолжительность.
# File activesupport/lib/active_support/duration.rb, line 228
def <=>(other)
if Duration === other
value <=> other.value
elsif Numeric === other
value <=> other
end
end Сравнивает одну продолжительность с другой или числом относительно этой продолжительности. Значения чисел обрабатываются как секунды.
# File activesupport/lib/active_support/duration.rb, line 308
def ==(other)
if Duration === other
other.value == value
else
other == value
end
end Возвращает true, если other также является экземпляром продолжительности с теми же value, или если other == value.
# File activesupport/lib/active_support/duration.rb, line 368 def ago(time = ::Time.current) sum(-1, time) end
Вычисляет новое время или дату, которое находится так же далеко в прошлом, как это представляет продолжительность.
# File activesupport/lib/active_support/duration.rb, line 350 def eql?(other) Duration === other && other.value.eql?(value) end
Возвращает true, если other также является экземпляром продолжительности, который имеет те же части, что и этот.
# File activesupport/lib/active_support/duration.rb, line 354 def hash @value.hash end
# File activesupport/lib/active_support/duration.rb, line 397 def iso8601(precision: nil) ISO8601Serializer.new(self, precision: precision).serialize end
Создать строку ISO 8601 Duration для этого интервала времени. Параметр precision может использоваться для ограничения точности секунд в интервале времени.
# File activesupport/lib/active_support/duration.rb, line 344 def to_i @value.to_i end
Возвращает количество секунд, представляемых этим Duration.
1.minute.to_i # => 60 1.hour.to_i # => 3600 1.day.to_i # => 86400
Обратите внимание, что эта конвертация делает некоторые предположения о продолжительности некоторых периодов, например, месяцы всегда составляют 1/12 от года, а годы составляют 365,2425 дней:
# equivalent to (1.year / 12).to_i 1.month.to_i # => 2629746 # equivalent to 365.2425.days.to_i 1.year.to_i # => 31556952
В таких случаях для точных вычислений дат и времени следует использовать встроенные в Ruby Date и Time.
# File activesupport/lib/active_support/duration.rb, line 320 def to_s @value.to_s end
Возвращает количество секунд, покрываемых интервалом времени, как строку. Для получения дополнительной информации см. метод #to_i.
1.day.to_s # => "86400"
© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.