Spec-Zone.ru › Ruby on Rails 7.2

класс ActiveSupport::Duration

Родитель:
Объект

Active Support Длительность

Обеспечивает точные измерения даты и времени, используя Date#advance и Time#advance соответственно. В основном поддерживает методы Numeric.

1.month.ago       # equivalent to Time.now.advance(months: -1)

Константы

PARTS
PARTS_IN_SECONDS
СЕКУНДЫ_В_СУТКИ
СЕКУНДЫ_В_ЧАС
СЕКУНДЫ_В_МИНУТУ
СЕКУНДЫ_В_МЕСЯЦ
СЕКУНДЫ_В_НЕДЕЛЮ
СЕКУНДЫ_В_ГОД
ПЕРЕМЕННЫЕ_ЧАСТИ

Атрибуты

value[R]

Публичные методы класса

build(value) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 189
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
  variable = false

  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

      unless parts[part].zero?
        variable ||= VARIABLE_PARTS.include?(part)
      end
    end
  end unless value == 0

  parts[:seconds] = remainder * remainder_sign

  new(value, parts, variable)
end

Создаёт новую Duration из значения в секундах, которое преобразуется в отдельные части:

ActiveSupport::Duration.build(31556952).parts # => {:years=>1}
ActiveSupport::Duration.build(2716146).parts  # => {:months=>1, :days=>1}
parse(iso8601duration) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 144
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.

Общедоступные методы экземпляров

%(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 312
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

Возвращает остаток от деления данного Duration на другой Duration или Numeric. Значения Numeric обрабатываются как секунды.

*(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 287
def *(other)
  if Scalar === other || Duration === other
    Duration.new(value * other.value, @parts.transform_values { |number| number * other.value }, @variable || other.variable?)
  elsif Numeric === other
    Duration.new(value * other, @parts.transform_values { |number| number * other }, @variable)
  else
    raise_type_error(other)
  end
end

Умножает данный Duration на Numeric и возвращает новый Duration.

+(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 268
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, @variable || other.variable?)
  else
    seconds = @parts.fetch(:seconds, 0) + other
    Duration.new(value + other, @parts.merge(seconds: seconds), @variable)
  end
end

Добавляет другой Duration или Numeric к этому Duration. Значения Numeric обрабатываются как секунды.

-(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 282
def -(other)
  self + (-other)
end

Вычитает другой Duration или Numeric из этого Duration. Значения Numeric обрабатываются как секунды.

/(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 298
def /(other)
  if Scalar === other
    Duration.new(value / other.value, @parts.transform_values { |number| number / other.value }, @variable)
  elsif Duration === other
    value / other.value
  elsif Numeric === other
    Duration.new(value / other, @parts.transform_values { |number| number / other }, @variable)
  else
    raise_type_error(other)
  end
end

Делит этот Duration на Numeric и возвращает новый Duration.

<=>(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 258
def <=>(other)
  if Duration === other
    value <=> other.value
  elsif Numeric === other
    value <=> other
  end
end

Сравнивает один Duration с другим или Numeric относительно этого Duration. Значения Numeric обрабатываются как секунды.

==(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 341
def ==(other)
  if Duration === other
    other.value == value
  else
    other == value
  end
end

Возвращает true, если other также является экземпляром Duration с теми же value, или если other == value.

after(time = ::Time.current)
Псевдоним для: since
ago(time = ::Time.current) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 444
def ago(time = ::Time.current)
  sum(-1, time)
end

Вычисляет новый Time или Date, который находится так же далеко в прошлом, как это Duration представляет.

Также псевдоним для: until, before
before(time = ::Time.current)
Псевдоним для: ago
eql?(other) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 426
def eql?(other)
  Duration === other && other.value.eql?(value)
end

Возвращает true, если other также является экземпляром Duration, который имеет те же части, что и этот.

from_now(time = ::Time.current)
Псевдоним для: since
hash() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 430
def hash
  @value.hash
end
in_days() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 399
def in_days
  in_seconds / SECONDS_PER_DAY.to_f
end

Возвращает количество дней, охватываемых продолжительностью, как число с плавающей точкой

12.hours.in_days # => 0.5
in_hours() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 392
def in_hours
  in_seconds / SECONDS_PER_HOUR.to_f
end

Возвращает количество часов, охватываемых продолжительностью, как число с плавающей точкой

1.day.in_hours # => 24.0
in_minutes() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 385
def in_minutes
  in_seconds / SECONDS_PER_MINUTE.to_f
end

Возвращает количество минут, охватываемых продолжительностью, как число с плавающей точкой

1.day.in_minutes # => 1440.0
in_months() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 413
def in_months
  in_seconds / SECONDS_PER_MONTH.to_f
end

Возвращает количество месяцев, охватываемых продолжительностью, как число с плавающей точкой

9.weeks.in_months # => 2.07
in_seconds()
Псевдоним для: to_i
in_weeks() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 406
def in_weeks
  in_seconds / SECONDS_PER_WEEK.to_f
end

Возвращает количество недель, охватываемых продолжительностью, как число с плавающей точкой

2.months.in_weeks # => 8.696
in_years() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 420
def in_years
  in_seconds / SECONDS_PER_YEAR.to_f
end

Возвращает количество лет, охватываемых продолжительностью, как число с плавающей точкой

30.days.in_years # => 0.082
iso8601(precision: nil) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 473
def iso8601(precision: nil)
  ISO8601Serializer.new(self, precision: precision).serialize
end

Создаёт строку ISO 8601 для данного Duration. Параметр precision может использоваться для ограничения точности секунд в продолжительности.

parts() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 241
def parts
  @parts.dup
end

Возвращает копию хеша parts, определяющего продолжительность.

5.minutes.parts # => {:minutes=>5}
3.years.parts # => {:years=>3}
since(time = ::Time.current) Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 436
def since(time = ::Time.current)
  sum(1, time)
end

Вычисляет новую Time или Date, которая находится в будущем на такое же время, как этот Duration.

Также алиасировано как: from_now, after
to_i() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 377
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.

Также алиасировано как: в секундах
to_s() Показать исходный код
# File activesupport/lib/active_support/duration.rb, line 353
def to_s
  @value.to_s
end

Возвращает количество секунд, охватываемых длительностью, в виде строки. Для получения дополнительной информации обратитесь к методу to_i.

1.day.to_s # => "86400"
until(time = ::Time.current)
Псевдоним для: ago

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API