Active Support Duration
使用 Date#advance
和 Time#advance
分別提供準確的日期和時間測量。它主要支援 Numeric
上的方法。
1.month.ago # equivalent to Time.now.advance(months: -1)
- #
- A
- B
- E
- F
- H
- I
- P
- S
- T
- U
常數
PARTS | = | [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze |
PARTS_IN_SECONDS | = | { 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 | = | 86400 |
SECONDS_PER_HOUR | = | 3600 |
SECONDS_PER_MINUTE | = | 60 |
SECONDS_PER_MONTH | = | 2629746 |
SECONDS_PER_WEEK | = | 604800 |
SECONDS_PER_YEAR | = | 31556952 |
VARIABLE_PARTS | = | [:years, :months, :weeks, :days].freeze |
屬性
[R] | value |
類別公開方法
build(value) 連結
從轉換為個別部分的秒數值建立新的 Duration
ActiveSupport::Duration.build(31556952).parts # => {:years=>1}
ActiveSupport::Duration.build(2716146).parts # => {:months=>1, :days=>1}
來源:顯示 | 在 GitHub 上
# 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
parse(iso8601duration) 連結
根據 ISO 8601 Duration
格式化的字串,建立一個新的 Duration
。
有關更多資訊,請參閱 ISO 8601。此方法允許在模式中存在負數部分。如果提供無效的字串,它會引發 ActiveSupport::Duration::ISO8601Parser::ParsingError
。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 144 def parse(iso8601duration) parts = ISO8601Parser.new(iso8601duration).parse! new(calculate_total_seconds(parts), parts) end
執行個體公開方法
%(other) 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 307 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
*(other) 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 282 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
+(other) 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 263 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
-(other) 連結
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 277 def -(other) self + (-other) end
/(other) 連結
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 293 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
<=>(other) 連結
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 253 def <=>(other) if Duration === other value <=> other.value elsif Numeric === other value <=> other end end
==(other) 連結
如果 other
也是具有相同 value
的 Duration
執行個體,或如果 other == value
,則傳回 true
。
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 336 def ==(other) if Duration === other other.value == value else other == value end end
ago(time = ::Time.current) 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 439 def ago(time = ::Time.current) sum(-1, time) end
eql?(other) 連結
如果 other
也是一個 Duration
實例,且與此實例具有相同的部份,則傳回 true
。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 421 def eql?(other) Duration === other && other.value.eql?(value) end
hash() 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 425 def hash @value.hash end
in_days() 連結
傳回持續時間涵蓋的天數,以浮點數表示
12.hours.in_days # => 0.5
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 394 def in_days in_seconds / SECONDS_PER_DAY.to_f end
in_hours() 連結
傳回持續時間涵蓋的小時數,以浮點數表示
1.day.in_hours # => 24.0
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 387 def in_hours in_seconds / SECONDS_PER_HOUR.to_f end
in_minutes() 連結
傳回持續時間涵蓋的分鐘數,以浮點數表示
1.day.in_minutes # => 1440.0
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 380 def in_minutes in_seconds / SECONDS_PER_MINUTE.to_f end
in_months() 連結
以浮點數回傳期間涵蓋的月份數
9.weeks.in_months # => 2.07
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 408 def in_months in_seconds / SECONDS_PER_MONTH.to_f end
in_weeks() 連結
以浮點數回傳期間涵蓋的週數
2.months.in_weeks # => 8.696
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 401 def in_weeks in_seconds / SECONDS_PER_WEEK.to_f end
in_years() 連結
以浮點數回傳期間涵蓋的年數
30.days.in_years # => 0.082
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 415 def in_years in_seconds / SECONDS_PER_YEAR.to_f end
iso8601(precision: nil) 連結
為此期間建立 ISO 8601 Duration
字串。precision
參數可用於限制期間的秒數精確度。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 468 def iso8601(precision: nil) ISO8601Serializer.new(self, precision: precision).serialize end
parts() 連結
回傳定義期間的 parts hash 副本
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 236 def parts @parts.dup end
since(time = ::Time.current) 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 431 def since(time = ::Time.current) sum(1, time) end
to_i() 連結
傳回此 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
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 372 def to_i @value.to_i end
to_s() 連結
傳回持續時間涵蓋的秒數,作為字串。如需更多資訊,請查看 to_i
方法。
1.day.to_s # => "86400"
來源: 顯示 | 在 GitHub 上
# File activesupport/lib/active_support/duration.rb, line 348 def to_s @value.to_s end