Class: ActiveSupport::TimeZone

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

Overview

Active Support Time Zone

The TimeZone class serves as a wrapper around TZInfo::Timezone instances. It allows us to do the following:

  • Limit the set of zones provided by TZInfo to a meaningful subset of 134 zones.

  • Retrieve and display zones with a friendlier name (e.g., “Eastern Time (US & Canada)” instead of “America/New_York”).

  • Lazily load TZInfo::Timezone instances only when they’re needed.

  • Create ActiveSupport::TimeWithZone instances via TimeZone’s local, parse, at, and now methods.

If you set config.time_zone in the Rails Application, you can access this TimeZone object via Time.zone:

# application.rb:
class Application < Rails::Application
  config.time_zone = 'Eastern Time (US & Canada)'
end

Time.zone      # => #<ActiveSupport::TimeZone:0x514834...>
Time.zone.name # => "Eastern Time (US & Canada)"
Time.zone.now  # => Sun, 18 May 2008 14:30:44 EDT -04:00

Constant Summary collapse

MAPPING =

Keys are Rails TimeZone names, values are TZInfo identifiers.

{
  "International Date Line West" => "Etc/GMT+12",
  "Midway Island"                => "Pacific/Midway",
  "American 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",
  "Montevideo"                   => "America/Montevideo",
  "Georgetown"                   => "America/Guyana",
  "Puerto Rico"                  => "America/Puerto_Rico",
  "Greenland"                    => "America/Godthab",
  "Mid-Atlantic"                 => "Atlantic/South_Georgia",
  "Azores"                       => "Atlantic/Azores",
  "Cape Verde Is."               => "Atlantic/Cape_Verde",
  "Dublin"                       => "Europe/Dublin",
  "Edinburgh"                    => "Europe/London",
  "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/Zurich",
  "Zurich"                       => "Europe/Zurich",
  "Rome"                         => "Europe/Rome",
  "Stockholm"                    => "Europe/Stockholm",
  "Vienna"                       => "Europe/Vienna",
  "West Central Africa"          => "Africa/Algiers",
  "Bucharest"                    => "Europe/Bucharest",
  "Cairo"                        => "Africa/Cairo",
  "Helsinki"                     => "Europe/Helsinki",
  "Kyiv"                         => "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",
  "Kaliningrad"                  => "Europe/Kaliningrad",
  "Moscow"                       => "Europe/Moscow",
  "St. Petersburg"               => "Europe/Moscow",
  "Volgograd"                    => "Europe/Volgograd",
  "Samara"                       => "Europe/Samara",
  "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/Kathmandu",
  "Astana"                       => "Asia/Dhaka",
  "Dhaka"                        => "Asia/Dhaka",
  "Sri Jayawardenepura"          => "Asia/Colombo",
  "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",
  "Ulaanbaatar"                  => "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/Canberra",
  "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",
  "Srednekolymsk"                => "Asia/Srednekolymsk",
  "Solomon Is."                  => "Pacific/Guadalcanal",
  "New Caledonia"                => "Pacific/Noumea",
  "Fiji"                         => "Pacific/Fiji",
  "Kamchatka"                    => "Asia/Kamchatka",
  "Marshall Is."                 => "Pacific/Majuro",
  "Auckland"                     => "Pacific/Auckland",
  "Wellington"                   => "Pacific/Auckland",
  "Nuku'alofa"                   => "Pacific/Tongatapu",
  "Tokelau Is."                  => "Pacific/Fakaofo",
  "Chatham Is."                  => "Pacific/Chatham",
  "Samoa"                        => "Pacific/Apia"
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

:stopdoc:



311
312
313
314
315
# File 'lib/active_support/values/time_zone.rb', line 311

def initialize(name, utc_offset = nil, tzinfo = nil)
  @name = name
  @utc_offset = utc_offset
  @tzinfo = tzinfo || TimeZone.find_tzinfo(name)
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



298
299
300
# File 'lib/active_support/values/time_zone.rb', line 298

def name
  @name
end

#tzinfoObject (readonly)

Returns the value of attribute tzinfo.



299
300
301
# File 'lib/active_support/values/time_zone.rb', line 299

def tzinfo
  @tzinfo
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.



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/active_support/values/time_zone.rb', line 234

def [](arg)
  case arg
  when self
    arg
  when String
    begin
      @lazy_zones_map[arg] ||= create(arg)
    rescue TZInfo::InvalidTimezoneIdentifier
      nil
    end
  when TZInfo::Timezone
    @lazy_zones_map[arg.name] ||= create(arg.name, nil, 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

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



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

def all
  @zones ||= zones_map.values.sort
end

.clearObject

:nodoc:



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

def clear # :nodoc:
  @lazy_zones_map = Concurrent::Map.new
  @country_zones  = Concurrent::Map.new
  @zones = nil
  @zones_map = nil
end

.country_zones(country_code) ⇒ Object

A convenience method for returning a collection of TimeZone objects for time zones in the country specified by its ISO 3166-1 Alpha2 code.



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

def country_zones(country_code)
  code = country_code.to_s.upcase
  @country_zones[code] ||= load_country_zones(code)
end

.createObject

:stopdoc:



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

alias_method :create, :new

.find_tzinfo(name) ⇒ Object



207
208
209
# File 'lib/active_support/values/time_zone.rb', line 207

def find_tzinfo(name)
  TZInfo::Timezone.get(MAPPING[name] || name)
end

.new(name) ⇒ Object

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



218
219
220
# File 'lib/active_support/values/time_zone.rb', line 218

def new(name)
  self[name]
end

.seconds_to_utc_offset(seconds, colon = true) ⇒ Object

Assumes self represents an offset from UTC in seconds (as returned from Time#utc_offset) and turns this into an +HH:MM formatted string.

ActiveSupport::TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00"


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

def seconds_to_utc_offset(seconds, colon = true)
  format = colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON
  sign = (seconds < 0 ? "-" : "+")
  hours = seconds.abs / 3600
  minutes = (seconds.abs % 3600) / 60
  format % [sign, hours, minutes]
end

.us_zonesObject

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



256
257
258
# File 'lib/active_support/values/time_zone.rb', line 256

def us_zones
  country_zones(:us)
end

Instance Method Details

#<=>(zone) ⇒ Object

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



335
336
337
338
339
340
# File 'lib/active_support/values/time_zone.rb', line 335

def <=>(zone)
  return unless zone.respond_to? :utc_offset
  result = (utc_offset <=> zone.utc_offset)
  result = (name <=> zone.name) if result == 0
  result
end

#=~(re) ⇒ Object

Compare #name and TZInfo identifier to a supplied regexp, returning true if a match is found.



344
345
346
# File 'lib/active_support/values/time_zone.rb', line 344

def =~(re)
  re === name || re === MAPPING[name]
end

#at(*args) ⇒ Object

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

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

A second argument can be supplied to specify sub-second precision.

Time.zone = 'Hawaii'                # => "Hawaii"
Time.at(946684800, 123456.789).nsec # => 123456789


381
382
383
# File 'lib/active_support/values/time_zone.rb', line 381

def at(*args)
  Time.at(*args).utc.in_time_zone(self)
end

#encode_with(coder) ⇒ Object

:nodoc:



577
578
579
580
# File 'lib/active_support/values/time_zone.rb', line 577

def encode_with(coder) # :nodoc:
  coder.tag = "!ruby/object:#{self.class}"
  coder.map = { "name" => tzinfo.name }
end

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

Returns a formatted string of the offset from UTC, or an alternative string if the time zone is already UTC.

zone = ActiveSupport::TimeZone['Central Time (US & Canada)']
zone.formatted_offset        # => "-06:00"
zone.formatted_offset(false) # => "-0600"


329
330
331
# File 'lib/active_support/values/time_zone.rb', line 329

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

#init_with(coder) ⇒ Object

:nodoc:



573
574
575
# File 'lib/active_support/values/time_zone.rb', line 573

def init_with(coder) # :nodoc:
  initialize(coder["name"])
end

#iso8601(str) ⇒ Object

Method for creating new ActiveSupport::TimeWithZone instance in time zone of self from an ISO 8601 string.

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

If the time components are missing then they will be set to zero.

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

If the string is invalid then an ArgumentError will be raised unlike parse which usually returns nil when given an invalid date string.



398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
# File 'lib/active_support/values/time_zone.rb', line 398

def iso8601(str)
  # Historically `Date._iso8601(nil)` returns `{}`, but in the `date` gem versions `3.2.1`, `3.1.2`, `3.0.2`,
  # and `2.0.1`, `Date._iso8601(nil)` raises `TypeError` https://github.com/ruby/date/issues/39
  # Future `date` releases are expected to revert back to the original behavior.
  raise ArgumentError, "invalid date" if str.nil?

  parts = Date._iso8601(str)

  year = parts.fetch(:year)

  if parts.key?(:yday)
    ordinal_date = Date.ordinal(year, parts.fetch(:yday))
    month = ordinal_date.month
    day = ordinal_date.day
  else
    month = parts.fetch(:mon)
    day = parts.fetch(:mday)
  end

  time = Time.new(
    year,
    month,
    day,
    parts.fetch(:hour, 0),
    parts.fetch(:min, 0),
    parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
    parts.fetch(:offset, 0)
  )

  if parts[:offset]
    TimeWithZone.new(time.utc, self)
  else
    TimeWithZone.new(nil, self, time)
  end

rescue Date::Error, KeyError
  raise ArgumentError, "invalid date"
end

#local(*args) ⇒ Object

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

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


365
366
367
368
# File 'lib/active_support/values/time_zone.rb', line 365

def local(*args)
  time = Time.utc(*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.



553
554
555
# File 'lib/active_support/values/time_zone.rb', line 553

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

#match?(re) ⇒ Boolean

Compare #name and TZInfo identifier to a supplied regexp, returning true if a match is found.

Returns:

  • (Boolean)


350
351
352
353
# File 'lib/active_support/values/time_zone.rb', line 350

def match?(re)
  (re == name) || (re == MAPPING[name]) ||
    ((Regexp === re) && (re.match?(name) || re.match?(MAPPING[name])))
end

#nowObject

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

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


518
519
520
# File 'lib/active_support/values/time_zone.rb', line 518

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.

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

However, if the date component is not provided, but any other upper components are supplied, then the day of the month defaults to 1:

Time.zone.parse('Mar 2000') # => Wed, 01 Mar 2000 00:00:00 HST -10:00

If the string is invalid then an ArgumentError could be raised.



455
456
457
# File 'lib/active_support/values/time_zone.rb', line 455

def parse(str, now = now())
  parts_to_time(Date._parse(str, false), now)
end

#period_for_local(time, dst = true) ⇒ Object

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



565
566
567
# File 'lib/active_support/values/time_zone.rb', line 565

def period_for_local(time, dst = true)
  tzinfo.period_for_local(time, dst) { |periods| periods.last }
end

#period_for_utc(time) ⇒ Object

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



559
560
561
# File 'lib/active_support/values/time_zone.rb', line 559

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

#periods_for_local(time) ⇒ Object

:nodoc:



569
570
571
# File 'lib/active_support/values/time_zone.rb', line 569

def periods_for_local(time) # :nodoc:
  tzinfo.periods_for_local(time)
end

#rfc3339(str) ⇒ Object

Method for creating new ActiveSupport::TimeWithZone instance in time zone of self from an RFC 3339 string.

Time.zone = 'Hawaii'                     # => "Hawaii"
Time.zone.rfc3339('2000-01-01T00:00:00Z') # => Fri, 31 Dec 1999 14:00:00 HST -10:00

If the time or zone components are missing then an ArgumentError will be raised. This is much stricter than either parse or iso8601 which allow for missing components.

Time.zone = 'Hawaii'            # => "Hawaii"
Time.zone.rfc3339('1999-12-31') # => ArgumentError: invalid date

Raises:

  • (ArgumentError)


471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
# File 'lib/active_support/values/time_zone.rb', line 471

def rfc3339(str)
  parts = Date._rfc3339(str)

  raise ArgumentError, "invalid date" if parts.empty?

  time = Time.new(
    parts.fetch(:year),
    parts.fetch(:mon),
    parts.fetch(:mday),
    parts.fetch(:hour),
    parts.fetch(:min),
    parts.fetch(:sec) + parts.fetch(:sec_fraction, 0),
    parts.fetch(:offset)
  )

  TimeWithZone.new(time.utc, self)
end

#strptime(str, format, now = now()) ⇒ Object

Parses str according to format and returns an ActiveSupport::TimeWithZone.

Assumes that str is a time in the time zone self, unless format includes an explicit time zone. (This is the same behavior as parse.) In either case, the returned TimeWithZone has the timezone of self.

Time.zone = 'Hawaii'                   # => "Hawaii"
Time.zone.strptime('1999-12-31 14:00:00', '%Y-%m-%d %H:%M:%S') # => 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.strptime('22:30:00', '%H:%M:%S') # => Fri, 31 Dec 1999 22:30:00 HST -10:00

However, if the date component is not provided, but any other upper components are supplied, then the day of the month defaults to 1:

Time.zone.strptime('Mar 2000', '%b %Y') # => Wed, 01 Mar 2000 00:00:00 HST -10:00


509
510
511
# File 'lib/active_support/values/time_zone.rb', line 509

def strptime(str, format, now = now())
  parts_to_time(DateTime._strptime(str, format), now)
end

#to_sObject

Returns a textual representation of this time zone.



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

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

#todayObject

Returns the current date in this time zone.



523
524
525
# File 'lib/active_support/values/time_zone.rb', line 523

def today
  tzinfo.now.to_date
end

#tomorrowObject

Returns the next date in this time zone.



528
529
530
# File 'lib/active_support/values/time_zone.rb', line 528

def tomorrow
  today + 1
end

#utc_offsetObject

Returns the offset of this time zone from UTC in seconds.



319
320
321
# File 'lib/active_support/values/time_zone.rb', line 319

def utc_offset
  @utc_offset || tzinfo&.current_period&.base_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 local time with the appropriate offset – if you want an ActiveSupport::TimeWithZone instance, use Time#in_time_zone() instead.

As of tzinfo 2, utc_to_local returns a Time with a non-zero utc_offset. See the utc_to_local_returns_utc_offset_times config for more info.



544
545
546
547
548
549
# File 'lib/active_support/values/time_zone.rb', line 544

def utc_to_local(time)
  tzinfo.utc_to_local(time).yield_self do |t|
    ActiveSupport.utc_to_local_returns_utc_offset_times ?
      t : Time.utc(t.year, t.month, t.day, t.hour, t.min, t.sec, t.sec_fraction * 1_000_000)
  end
end

#yesterdayObject

Returns the previous date in this time zone.



533
534
535
# File 'lib/active_support/values/time_zone.rb', line 533

def yesterday
  today - 1
end