Class: Timezone::Zone

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/timezone/zone.rb

Constant Summary collapse

ZONE_FILE_PATH =
File.expand_path(File.dirname(__FILE__)+'/../../data')

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Zone

Create a new Timezone object.

Timezone.new(options)

:zone - The actual name of the zone. For example, Australia/Sydney or Americas/Los_Angeles. :lat, :lon - The latitude and longitude of the location. :latlon - The array of latitude and longitude of the location.

If a latitude and longitude is passed in, the Timezone object will do a lookup for the actual zone name and then use that as a reference. It will then load the appropriate json timezone information for that zone, and compile a list of the timezone rules.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/timezone/zone.rb', line 26

def initialize options
  if options.has_key?(:lat) && options.has_key?(:lon)
    options[:zone] = timezone_id options[:lat], options[:lon]
  elsif options.has_key?(:latlon)
    options[:zone] = timezone_id *options[:latlon]
  end

  raise Timezone::Error::NilZone, 'No zone was found. Please specify a zone.' if options[:zone].nil?

  data = Zone.get_zone_data(options[:zone])

  @rules = data['zone']
  @zone = data['_zone'] || options[:zone]
end

Instance Attribute Details

#rulesObject

Returns the value of attribute rules.



11
12
13
# File 'lib/timezone/zone.rb', line 11

def rules
  @rules
end

#zoneObject

Returns the value of attribute zone.



11
12
13
# File 'lib/timezone/zone.rb', line 11

def zone
  @zone
end

Class Method Details

.get_zone_data(zone) ⇒ Object

Retrieve the data from a particular time zone



68
69
70
71
72
73
74
75
# File 'lib/timezone/zone.rb', line 68

def get_zone_data(zone)
  file = File.join(ZONE_FILE_PATH, "#{zone}.json")
  begin
    return JSON.parse(open(file).read)
  rescue
    raise Timezone::Error::InvalidZone, "'#{zone}' is not a valid zone."
  end
end

.list(*args) ⇒ Object

Get a list of specified timezones and the basic information accompanying that zone

zones = Timezone::Zone.list(*zones)

zones - An array of timezone names. (i.e. Timezone::Zones.list(“America/Chicago”, “Australia/Sydney”))

The result is a Hash of timezones with their title, offset in seconds, UTC offset, and if it uses DST.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/timezone/zone.rb', line 92

def list(*args)
  args = nil if args.empty? # set to nil if no args are provided
  zones = args || Configure.default_for_list || self.names # get default list
  list = self.names.select { |name| zones.include? name } # only select zones if they exist

  @zones = []
  list.each do |zone|
    item = Zone.new(zone: zone)
    @zones << {
      :zone => item.zone,
      :title => Configure.replacements[item.zone] || item.zone,
      :offset => item.utc_offset,
      :utc_offset => (item.utc_offset/(60*60)),
      :dst => item.time(Time.now).dst?
    }
  end
  @zones.sort_by! { |zone| zone[Configure.order_list_by] }
end

.namesObject

Instantly grab all possible time zone names.



78
79
80
81
82
# File 'lib/timezone/zone.rb', line 78

def names
  @@names ||= Dir[File.join(ZONE_FILE_PATH, "**/**/*.json")].collect do |file|
    file.gsub("#{ZONE_FILE_PATH}/", '').gsub(".json", '')
  end
end

Instance Method Details

#<=>(zone) ⇒ Object

:nodoc:



61
62
63
# File 'lib/timezone/zone.rb', line 61

def <=> zone #:nodoc:
  utc_offset <=> zone.utc_offset
end

#time(reference) ⇒ Object

Determine the time in the timezone.

timezone.time(reference)

reference - The Time you want to convert.

The reference is converted to a UTC equivalent. That UTC equivalent is then used to lookup the appropriate offset in the timezone rules. Once the offset has been found that offset is added to the reference UTC time to calculate the reference time in the timezone.



50
51
52
# File 'lib/timezone/zone.rb', line 50

def time reference
  reference.utc + rule_for_reference(reference)['offset']
end

#utc_offset(reference = Time.now) ⇒ Object

Get the current UTC offset in seconds for this timezone.

timezone.utc_offset(reference)


57
58
59
# File 'lib/timezone/zone.rb', line 57

def utc_offset reference=Time.now
  rule_for_reference(reference)['offset']
end