Class: Fluent::Timezone

Inherits:
Object
  • Object
show all
Defined in:
lib/fluent/timezone.rb

Constant Summary collapse

NUMERIC_PATTERN =

[+-]HH:MM, [+-]HHMM, [+-]HH

%r{\A[+-]\d\d(:?\d\d)?\z}
NAME_PATTERN =

Region/Zone, Region/Zone/Zone

%r{\A[^/]+/[^/]+(/[^/]+)?\z}

Class Method Summary collapse

Class Method Details

.formatter(timezone = nil, format = nil) ⇒ Object

Create a formatter for a timezone and optionally a format.

An Proc object is returned. If the given timezone is invalid, nil is returned.



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/fluent/timezone.rb', line 91

def self.formatter(timezone = nil, format = nil)
  if timezone.nil?
    return nil
  end

  # [+-]HH:MM, [+-]HHMM, [+-]HH
  if NUMERIC_PATTERN === timezone
    offset = Time.zone_offset(timezone)

    if format
      return Proc.new {|time|
        Time.at(time).localtime(offset).strftime(format)
      }
    else
      return Proc.new {|time|
        Time.at(time).localtime(offset).iso8601
      }
    end
  end

  # Region/Zone, Region/Zone/Zone
  if NAME_PATTERN === timezone
    begin
      tz = TZInfo::Timezone.get(timezone)
    rescue
      return nil
    end

    if format
      return Proc.new {|time|
        Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).strftime(format)
      }
    else
      return Proc.new {|time|
        Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).iso8601
      }
    end
  end

  return nil
end

.validate(timezone) ⇒ Object

Validate the format of the specified timezone.

Valid formats are as follows. Note that timezone abbreviations such as PST and JST are not supported intentionally.

1. [+-]HH:MM         (e.g. "+09:00")
2. [+-]HHMM          (e.g. "+0900")
3. [+-]HH            (e.g. "+09")
4. Region/Zone       (e.g. "Asia/Tokyo")
5. Region/Zone/Zone  (e.g. "America/Argentina/Buenos_Aires")

In the 4th and 5th cases, it is checked whether the specified timezone exists in the timezone database.

When the given timezone is valid, true is returned. Otherwise, false is returned. When nil is given, false is returned.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/fluent/timezone.rb', line 45

def self.validate(timezone)
  # If the specified timezone is nil.
  if timezone.nil?
    # Invalid.
    return false
  end

  # [+-]HH:MM, [+-]HHMM, [+-]HH
  if NUMERIC_PATTERN === timezone
    # Valid. It can be parsed by Time.zone_offset method.
    return true
  end

  # Region/Zone, Region/Zone/Zone
  if NAME_PATTERN === timezone
    begin
      # Get a Timezone instance for the specified timezone.
      TZInfo::Timezone.get(timezone)
    rescue
      # Invalid. The string does not exist in the timezone database.
      return false
    else
      # Valid. The string was found in the timezone database.
      return true
    end
  else
    # Invalid. Timezone abbreviations are not supported.
    return false
  end
end

.validate!(timezone) ⇒ Object

Validate the format of the specified timezone.

The implementation of this method calls validate(timezone) method to check whether the given timezone is valid. When invalid, this method raises a ConfigError.



81
82
83
84
85
# File 'lib/fluent/timezone.rb', line 81

def self.validate!(timezone)
  unless validate(timezone)
    raise ConfigError, "Unsupported timezone '#{timezone}'"
  end
end