class Sequel::Postgres::IntervalDatabaseMethods::Parser
Creates callable objects that convert strings into ActiveSupport::Duration instances.
Public Instance Methods
call(string)
click to toggle source
Parse the interval input string into an ActiveSupport::Duration instance.
# File lib/sequel/extensions/pg_interval.rb 65 def call(string) 66 raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string) 67 68 value = 0 69 parts = [] 70 71 if v = matches[1] 72 v = v.to_i 73 value += 31557600 * v 74 parts << [:years, v] 75 end 76 if v = matches[2] 77 v = v.to_i 78 value += 2592000 * v 79 parts << [:months, v] 80 end 81 if v = matches[3] 82 v = v.to_i 83 value += 86400 * v 84 parts << [:days, v] 85 end 86 if matches[5] 87 seconds = matches[5].to_i * 3600 + matches[6].to_i * 60 88 seconds += matches[8] ? matches[7].to_f : matches[7].to_i 89 seconds *= -1 if matches[4] == '-' 90 value += seconds 91 parts << [:seconds, seconds] 92 elsif matches[9] || matches[10] || matches[11] 93 seconds = 0 94 if v = matches[9] 95 seconds += v.to_i * 3600 96 end 97 if v = matches[10] 98 seconds += v.to_i * 60 99 end 100 if v = matches[11] 101 seconds += matches[12] ? v.to_f : v.to_i 102 end 103 value += seconds 104 parts << [:seconds, seconds] 105 end 106 107 ActiveSupport::Duration.new(value, parts) 108 end