Class: ActiveSupport::TimeZone

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/active_support/values/time_zone.rb

Constant Summary collapse

MAPPING =

Keys are Rails TimeZone names, values are TZInfo identifiers

{
  "International Date Line West" => "Pacific/Midway",
  "Midway Island"                => "Pacific/Midway",
  "Samoa"                        => "Pacific/Pago_Pago",
  "Hawaii"                       => "Pacific/Honolulu",
  "Alaska"                       => "America/Juneau",
  "Pacific Time (US & Canada)"   => "America/Los_Angeles",
  "Tijuana"                      => "America/Tijuana",
  "Mountain Time (US & Canada)"  => "America/Denver",
  "Arizona"                      => "America/Phoenix",
  "Chihuahua"                    => "America/Chihuahua",
  "Mazatlan"                     => "America/Mazatlan",
  "Central Time (US & Canada)"   => "America/Chicago",
  "Saskatchewan"                 => "America/Regina",
  "Guadalajara"                  => "America/Mexico_City",
  "Mexico City"                  => "America/Mexico_City",
  "Monterrey"                    => "America/Monterrey",
  "Central America"              => "America/Guatemala",
  "Eastern Time (US & Canada)"   => "America/New_York",
  "Indiana (East)"               => "America/Indiana/Indianapolis",
  "Bogota"                       => "America/Bogota",
  "Lima"                         => "America/Lima",
  "Quito"                        => "America/Lima",
  "Atlantic Time (Canada)"       => "America/Halifax",
  "Caracas"                      => "America/Caracas",
  "La Paz"                       => "America/La_Paz",
  "Santiago"                     => "America/Santiago",
  "Newfoundland"                 => "America/St_Johns",
  "Brasilia"                     => "America/Sao_Paulo",
  "Buenos Aires"                 => "America/Argentina/Buenos_Aires",
  "Georgetown"                   => "America/Argentina/San_Juan",
  "Greenland"                    => "America/Godthab",
  "Mid-Atlantic"                 => "Atlantic/South_Georgia",
  "Azores"                       => "Atlantic/Azores",
  "Cape Verde Is."               => "Atlantic/Cape_Verde",
  "Dublin"                       => "Europe/Dublin",
  "Edinburgh"                    => "Europe/Dublin",
  "Lisbon"                       => "Europe/Lisbon",
  "London"                       => "Europe/London",
  "Casablanca"                   => "Africa/Casablanca",
  "Monrovia"                     => "Africa/Monrovia",
  "UTC"                          => "Etc/UTC",
  "Belgrade"                     => "Europe/Belgrade",
  "Bratislava"                   => "Europe/Bratislava",
  "Budapest"                     => "Europe/Budapest",
  "Ljubljana"                    => "Europe/Ljubljana",
  "Prague"                       => "Europe/Prague",
  "Sarajevo"                     => "Europe/Sarajevo",
  "Skopje"                       => "Europe/Skopje",
  "Warsaw"                       => "Europe/Warsaw",
  "Zagreb"                       => "Europe/Zagreb",
  "Brussels"                     => "Europe/Brussels",
  "Copenhagen"                   => "Europe/Copenhagen",
  "Madrid"                       => "Europe/Madrid",
  "Paris"                        => "Europe/Paris",
  "Amsterdam"                    => "Europe/Amsterdam",
  "Berlin"                       => "Europe/Berlin",
  "Bern"                         => "Europe/Berlin",
  "Rome"                         => "Europe/Rome",
  "Stockholm"                    => "Europe/Stockholm",
  "Vienna"                       => "Europe/Vienna",
  "West Central Africa"          => "Africa/Algiers",
  "Bucharest"                    => "Europe/Bucharest",
  "Cairo"                        => "Africa/Cairo",
  "Helsinki"                     => "Europe/Helsinki",
  "Kyev"                         => "Europe/Kiev",
  "Riga"                         => "Europe/Riga",
  "Sofia"                        => "Europe/Sofia",
  "Tallinn"                      => "Europe/Tallinn",
  "Vilnius"                      => "Europe/Vilnius",
  "Athens"                       => "Europe/Athens",
  "Istanbul"                     => "Europe/Istanbul",
  "Minsk"                        => "Europe/Minsk",
  "Jerusalem"                    => "Asia/Jerusalem",
  "Harare"                       => "Africa/Harare",
  "Pretoria"                     => "Africa/Johannesburg",
  "Moscow"                       => "Europe/Moscow",
  "St. Petersburg"               => "Europe/Moscow",
  "Volgograd"                    => "Europe/Moscow",
  "Kuwait"                       => "Asia/Kuwait",
  "Riyadh"                       => "Asia/Riyadh",
  "Nairobi"                      => "Africa/Nairobi",
  "Baghdad"                      => "Asia/Baghdad",
  "Tehran"                       => "Asia/Tehran",
  "Abu Dhabi"                    => "Asia/Muscat",
  "Muscat"                       => "Asia/Muscat",
  "Baku"                         => "Asia/Baku",
  "Tbilisi"                      => "Asia/Tbilisi",
  "Yerevan"                      => "Asia/Yerevan",
  "Kabul"                        => "Asia/Kabul",
  "Ekaterinburg"                 => "Asia/Yekaterinburg",
  "Islamabad"                    => "Asia/Karachi",
  "Karachi"                      => "Asia/Karachi",
  "Tashkent"                     => "Asia/Tashkent",
  "Chennai"                      => "Asia/Kolkata",
  "Kolkata"                      => "Asia/Kolkata",
  "Mumbai"                       => "Asia/Kolkata",
  "New Delhi"                    => "Asia/Kolkata",
  "Kathmandu"                    => "Asia/Katmandu",
  "Astana"                       => "Asia/Dhaka",
  "Dhaka"                        => "Asia/Dhaka",
  "Sri Jayawardenepura"          => "Asia/Dhaka",
  "Almaty"                       => "Asia/Almaty",
  "Novosibirsk"                  => "Asia/Novosibirsk",
  "Rangoon"                      => "Asia/Rangoon",
  "Bangkok"                      => "Asia/Bangkok",
  "Hanoi"                        => "Asia/Bangkok",
  "Jakarta"                      => "Asia/Jakarta",
  "Krasnoyarsk"                  => "Asia/Krasnoyarsk",
  "Beijing"                      => "Asia/Shanghai",
  "Chongqing"                    => "Asia/Chongqing",
  "Hong Kong"                    => "Asia/Hong_Kong",
  "Urumqi"                       => "Asia/Urumqi",
  "Kuala Lumpur"                 => "Asia/Kuala_Lumpur",
  "Singapore"                    => "Asia/Singapore",
  "Taipei"                       => "Asia/Taipei",
  "Perth"                        => "Australia/Perth",
  "Irkutsk"                      => "Asia/Irkutsk",
  "Ulaan Bataar"                 => "Asia/Ulaanbaatar",
  "Seoul"                        => "Asia/Seoul",
  "Osaka"                        => "Asia/Tokyo",
  "Sapporo"                      => "Asia/Tokyo",
  "Tokyo"                        => "Asia/Tokyo",
  "Yakutsk"                      => "Asia/Yakutsk",
  "Darwin"                       => "Australia/Darwin",
  "Adelaide"                     => "Australia/Adelaide",
  "Canberra"                     => "Australia/Melbourne",
  "Melbourne"                    => "Australia/Melbourne",
  "Sydney"                       => "Australia/Sydney",
  "Brisbane"                     => "Australia/Brisbane",
  "Hobart"                       => "Australia/Hobart",
  "Vladivostok"                  => "Asia/Vladivostok",
  "Guam"                         => "Pacific/Guam",
  "Port Moresby"                 => "Pacific/Port_Moresby",
  "Magadan"                      => "Asia/Magadan",
  "Solomon Is."                  => "Asia/Magadan",
  "New Caledonia"                => "Pacific/Noumea",
  "Fiji"                         => "Pacific/Fiji",
  "Kamchatka"                    => "Asia/Kamchatka",
  "Marshall Is."                 => "Pacific/Majuro",
  "Auckland"                     => "Pacific/Auckland",
  "Wellington"                   => "Pacific/Auckland",
  "Nuku'alofa"                   => "Pacific/Tongatapu"
}.each { |name, zone| name.freeze; zone.freeze }
ZONES =
[]
ZONES_MAP =
{}
US_ZONES =
ZONES.find_all { |z| z.name =~ /US|Arizona|Indiana|Hawaii|Alaska/ }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, utc_offset, tzinfo = nil) ⇒ TimeZone

Create a new TimeZone object with the given name and offset. The offset is the number of seconds that this time zone is offset from UTC (GMT). Seconds were chosen as the offset unit because that is the unit that Ruby uses to represent time zone offsets (see Time#utc_offset).



180
181
182
183
184
# File 'lib/active_support/values/time_zone.rb', line 180

def initialize(name, utc_offset, tzinfo = nil)
  @name = name
  @utc_offset = utc_offset
  @tzinfo = tzinfo
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



174
175
176
# File 'lib/active_support/values/time_zone.rb', line 174

def name
  @name
end

Class Method Details

.[](arg) ⇒ Object

Locate a specific time zone object. If the argument is a string, it is interpreted to mean the name of the timezone to locate. If it is a numeric value it is either the hour offset, or the second offset, of the timezone to find. (The first one with that offset will be returned.) Returns nil if no such time zone is known to the system.



377
378
379
380
381
382
383
384
385
386
387
# File 'lib/active_support/values/time_zone.rb', line 377

def [](arg)
  case arg
    when String
      ZONES_MAP[arg]
    when Numeric, ActiveSupport::Duration
      arg *= 3600 if arg.abs <= 13
      all.find { |z| z.utc_offset == arg.to_i }
    else
      raise ArgumentError, "invalid argument to TimeZone[]: #{arg.inspect}"
  end
end

.allObject

Return an array of all TimeZone objects. There are multiple TimeZone objects per time zone, in many cases, to make it easier for users to find their own time zone.



368
369
370
# File 'lib/active_support/values/time_zone.rb', line 368

def all
  ZONES
end

.createObject



356
# File 'lib/active_support/values/time_zone.rb', line 356

alias_method :create, :new

.new(name) ⇒ Object

Return a TimeZone instance with the given name, or nil if no such TimeZone instance exists. (This exists to support the use of this class with the composed_of macro.)



361
362
363
# File 'lib/active_support/values/time_zone.rb', line 361

def new(name)
  self[name]
end

.us_zonesObject

A convenience method for returning a collection of TimeZone objects for time zones in the USA.



391
392
393
# File 'lib/active_support/values/time_zone.rb', line 391

def us_zones
  US_ZONES
end

Instance Method Details

#<=>(zone) ⇒ Object

Compare this time zone to the parameter. The two are comapred first on their offsets, and then by name.



198
199
200
201
202
# File 'lib/active_support/values/time_zone.rb', line 198

def <=>(zone)
  result = (utc_offset <=> zone.utc_offset)
  result = (name <=> zone.name) if result == 0
  result
end

#at(secs) ⇒ Object

Method for creating new ActiveSupport::TimeWithZone instance in time zone of self from number of seconds since the Unix epoch. Example:

Time.zone = "Hawaii"        # => "Hawaii"
Time.utc(2000).to_f         # => 946684800.0
Time.zone.at(946684800.0)   # => Fri, 31 Dec 1999 14:00:00 HST -10:00


223
224
225
226
# File 'lib/active_support/values/time_zone.rb', line 223

def at(secs)
  utc = Time.at(secs).utc rescue DateTime.civil(1970).since(secs)
  utc.in_time_zone(self)
end

#formatted_offset(colon = true, alternate_utc_string = nil) ⇒ Object

Returns the offset of this time zone as a formatted string, of the format “+HH:MM”.



192
193
194
# File 'lib/active_support/values/time_zone.rb', line 192

def formatted_offset(colon=true, alternate_utc_string = nil)
  utc_offset == 0 && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
end

#local(*args) ⇒ Object

Method for creating new ActiveSupport::TimeWithZone instance in time zone of self from given values. Example:

Time.zone = "Hawaii"                      # => "Hawaii"
Time.zone.local(2007, 2, 1, 15, 30, 45)   # => Thu, 01 Feb 2007 15:30:45 HST -10:00


213
214
215
216
# File 'lib/active_support/values/time_zone.rb', line 213

def local(*args)
  time = Time.utc_time(*args)
  ActiveSupport::TimeWithZone.new(nil, self, time)
end

#local_to_utc(time, dst = true) ⇒ Object

Adjust the given time to the simultaneous time in UTC. Returns a Time.utc() instance.



269
270
271
# File 'lib/active_support/values/time_zone.rb', line 269

def local_to_utc(time, dst=true)
  tzinfo.local_to_utc(time, dst)
end

#nowObject

Returns an ActiveSupport::TimeWithZone instance representing the current time in the time zone represented by self. Example:

Time.zone = 'Hawaii'  # => "Hawaii"
Time.zone.now         # => Wed, 23 Jan 2008 20:24:27 HST -10:00


253
254
255
# File 'lib/active_support/values/time_zone.rb', line 253

def now
  Time.now.utc.in_time_zone(self)
end

#parse(str, now = now) ⇒ Object

Method for creating new ActiveSupport::TimeWithZone instance in time zone of self from parsed string. Example:

Time.zone = "Hawaii"                      # => "Hawaii"
Time.zone.parse('1999-12-31 14:00:00')    # => Fri, 31 Dec 1999 14:00:00 HST -10:00

If upper components are missing from the string, they are supplied from TimeZone#now:

Time.zone.now                 # => Fri, 31 Dec 1999 14:00:00 HST -10:00
Time.zone.parse('22:30:00')   # => Fri, 31 Dec 1999 22:30:00 HST -10:00


237
238
239
240
241
242
243
244
245
246
# File 'lib/active_support/values/time_zone.rb', line 237

def parse(str, now=now)
  date_parts = Date._parse(str)
  return if date_parts.blank?
  time = Time.parse(str, now) rescue DateTime.parse(str)
  if date_parts[:offset].nil?
    ActiveSupport::TimeWithZone.new(nil, self, time)
  else
    time.in_time_zone(self)
  end
end

#period_for_local(time, dst = true) ⇒ Object

Available so that TimeZone instances respond like TZInfo::Timezone instances



279
280
281
# File 'lib/active_support/values/time_zone.rb', line 279

def period_for_local(time, dst=true)
  tzinfo.period_for_local(time, dst)
end

#period_for_utc(time) ⇒ Object

Available so that TimeZone instances respond like TZInfo::Timezone instances



274
275
276
# File 'lib/active_support/values/time_zone.rb', line 274

def period_for_utc(time)
  tzinfo.period_for_utc(time)
end

#to_sObject

Returns a textual representation of this time zone.



205
206
207
# File 'lib/active_support/values/time_zone.rb', line 205

def to_s
  "(GMT#{formatted_offset}) #{name}"
end

#todayObject

Return the current date in this time zone.



258
259
260
# File 'lib/active_support/values/time_zone.rb', line 258

def today
  tzinfo.now.to_date
end

#tzinfoObject

TODO: Preload instead of lazy load for thread safety



284
285
286
# File 'lib/active_support/values/time_zone.rb', line 284

def tzinfo
  @tzinfo ||= TZInfo::Timezone.get(MAPPING[name])
end

#utc_offsetObject



186
187
188
# File 'lib/active_support/values/time_zone.rb', line 186

def utc_offset
  @utc_offset ||= tzinfo.current_period.utc_offset
end

#utc_to_local(time) ⇒ Object

Adjust the given time to the simultaneous time in the time zone represented by self. Returns a Time.utc() instance – if you want an ActiveSupport::TimeWithZone instance, use Time#in_time_zone() instead.



264
265
266
# File 'lib/active_support/values/time_zone.rb', line 264

def utc_to_local(time)
  tzinfo.utc_to_local(time)
end