class Fluent::TimeParser
def initialize(format = nil, localtime = true, timezone = nil)
def initialize(format = nil, localtime = true, timezone = nil) if format.nil? && (timezone || !localtime) raise Fluent::ConfigError, "specifying timezone requires time format" end @cache1_key = nil @cache1_time = nil @cache2_key = nil @cache2_time = nil format_with_timezone = format && (format.include?("%z") || format.include?("%Z")) # unixtime_in_expected_tz = unixtime_in_localtime + offset_diff offset_diff = case when format_with_timezone then nil when timezone then offset = Fluent::Timezone.utc_offset(timezone) if offset.respond_to?(:call) ->(t) { Time.now.localtime.utc_offset - offset.call(t) } else Time.now.localtime.utc_offset - offset end when localtime then 0 else Time.now.localtime.utc_offset # utc end strptime = format && (Strptime.new(format) rescue nil) @parse = case when format_with_timezone && strptime then ->(v){ Fluent::EventTime.from_time(strptime.exec(v)) } when format_with_timezone then ->(v){ Fluent::EventTime.from_time(Time.strptime(v, format)) } when format == '%iso8601' then ->(v){ Fluent::EventTime.from_time(Time.iso8601(v)) } when strptime then if offset_diff.respond_to?(:call) ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) } else ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) } end when format then if offset_diff.respond_to?(:call) ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) } else ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) } end else ->(v){ Fluent::EventTime.parse(v) } end end
def parse(value)
def parse(value) unless value.is_a?(String) raise TimeParseError, "value must be string: #{value}" end if @cache1_key == value return @cache1_time elsif @cache2_key == value return @cache2_time else begin time = @parse.call(value) rescue => e raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}" end @cache1_key = @cache2_key @cache1_time = @cache2_time @cache2_key = value @cache2_time = time return time end end