Class: Timezone::Zone

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

Constant Summary collapse

SOURCE_BIT =
0
NAME_BIT =
1
DST_BIT =
2
OFFSET_BIT =
3
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.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/timezone/zone.rb', line 32

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 = get_zone_data(options[:zone])

  @rules = []

  data.split("\n").each do |line|
    source, name, dst, offset = line.split(':')
    source = source.to_i
    dst = dst == '1'
    offset = offset.to_i
    source = @rules.last[SOURCE_BIT]+source if @rules.last
    @rules << [source, name, dst, offset]
  end

  @zone = options[:zone]
end

Instance Attribute Details

#rulesObject (readonly)

Returns the value of attribute rules.



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

def rules
  @rules
end

#zoneObject (readonly)

Returns the value of attribute zone.



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

def zone
  @zone
end

Class Method Details

.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.



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/timezone/zone.rb', line 106

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 = []
  now = Time.now
  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.dst?(now)
    }
  end
  @zones.sort_by! { |zone| zone[Configure.order_list_by] }
end

.namesObject

Instantly grab all possible time zone names.



92
93
94
95
96
# File 'lib/timezone/zone.rb', line 92

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

Instance Method Details

#<=>(zone) ⇒ Object

:nodoc:



86
87
88
# File 'lib/timezone/zone.rb', line 86

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

#active_support_time_zoneObject



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

def active_support_time_zone
  @active_support_time_zone ||= Timezone::ActiveSupport.format(@zone)
end

#dst?(reference) ⇒ Boolean

Whether or not the time in the timezone is in DST.

Returns:

  • (Boolean)


75
76
77
# File 'lib/timezone/zone.rb', line 75

def dst?(reference)
  rule_for_reference(reference)[DST_BIT]
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.



70
71
72
# File 'lib/timezone/zone.rb', line 70

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

#utc_offset(reference = Time.now) ⇒ Object

Get the current UTC offset in seconds for this timezone.

timezone.utc_offset(reference)


82
83
84
# File 'lib/timezone/zone.rb', line 82

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