Spec-Zone.ru › Ruby on Rails 6.1

класс ActiveSupport::TimeZone

Родитель:
Объект
Включенные модули:

Класс TimeZone служит оболочкой над экземплярами TZInfo::Timezone. Он позволяет:

  • Ограничить набор зон, предоставляемых TZInfo, до разумного подмножества 134 зон.

  • Получать и отображать зоны с более дружественным именем (например, «Восточное Time (США и Канада)» вместо «America/New_York»).

  • Лениво загружать экземпляры TZInfo::Timezone только при необходимости.

  • Создавать экземпляры ActiveSupport::TimeWithZone через методы TimeZone's local, parse, at и now.

Если вы установите config.time_zone в приложении Rails, вы можете получить доступ к этому объекту TimeZone через 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

Константы

MAPPING

Ключами являются имена Rails TimeZone, значениями — идентификаторы TZInfo.

Атрибуты

name[R]
tzinfo[R]

Публичные методы класса

[](arg) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 230
def [](arg)
  case arg
  when String
    begin
      @lazy_zones_map[arg] ||= create(arg)
    rescue TZInfo::InvalidTimezoneIdentifier
      nil
    end
  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

Находит объект определённой временной зоны. Если аргумент — строка, она интерпретируется как имя зоны. Если число, оно представляет либо смещение по часам, либо смещение по секундам для поиска временной зоны. (Будет возвращена первая зона с таким смещением.) Возвращает nil , если такая временная зона не известна системе.

all() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 221
def all
  @zones ||= zones_map.values.sort
end

Возвращает массив всех объектов TimeZone. В большинстве случаев для каждой временной зоны существуют несколько объектов TimeZone, чтобы пользователям было проще найти свою временную зону.

country_zones(country_code) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 254
def country_zones(country_code)
  code = country_code.to_s.upcase
  @country_zones[code] ||= load_country_zones(code)
end

Удобный метод для возвращения коллекции объектов TimeZone для временных зон в указанной стране по её коду ISO 3166-1 Alpha2.

create(name)
Псевдоним для: new
find_tzinfo(name) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 205
def find_tzinfo(name)
  TZInfo::Timezone.get(MAPPING[name] || name)
end
new(name) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 214
def new(name)
  self[name]
end

Возвращает экземпляр TimeZone с заданным именем или nil , если такой экземпляр TimeZone не существует. (Это необходимо для работы с этим классом с помощью макроса composed_of.)

Также алиас для: create
new(name, utc_offset = nil, tzinfo = nil) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 297
def initialize(name, utc_offset = nil, tzinfo = nil)
  @name = name
  @utc_offset = utc_offset
  @tzinfo = tzinfo || TimeZone.find_tzinfo(name)
end

Создаёт новый объект TimeZone с заданным именем и смещением. Смещение — количество секунд, на которое эта временная зона смещена от UTC (GMT). Секунды выбраны как единица смещения, поскольку Руби использует их для представления смещений временных зон (см. Time#utc_offset).

seconds_to_utc_offset(seconds, colon = true) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 197
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

Предполагает, что self представляет смещение от UTC в секундах (как возвращается из Time#utc_offset) и преобразует его в строку формата +HH:MM.

ActiveSupport::TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00"
us_zones() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 248
def us_zones
  country_zones(:us)
end

Удобный метод для возвращения коллекции объектов TimeZone для временных зон США.

Общедоступные методы экземпляра

<=>(zone) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 320
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) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 329
def =~(re)
  re === name || re === MAPPING[name]
end

Сравнение name и идентификатора TZInfo с предоставленным регулярным выражением, возвращая true в случае совпадения.

at(*args) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 366
def at(*args)
  Time.at(*args).utc.in_time_zone(self)
end

Method для создания нового экземпляра ActiveSupport::TimeWithZone в часовом поясе self по количеству секунд с начала эпохи Unix.

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

Второй аргумент может быть предоставлен для указания точности до долей секунды.

Time.zone = 'Hawaii'                # => "Hawaii"
Time.at(946684800, 123456.789).nsec # => 123456789
formatted_offset(colon = true, alternate_utc_string = nil) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 314
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

Возвращает отформатированную строку смещения от UTC или альтернативную строку, если часовой пояс уже UTC.

zone = ActiveSupport::TimeZone['Central Time (US & Canada)']
zone.formatted_offset        # => "-06:00"
zone.formatted_offset(false) # => "-0600"
iso8601(str) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 383
def iso8601(str)
  parts = Date._iso8601(str)

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

  time = Time.new(
    parts.fetch(:year),
    parts.fetch(:mon),
    parts.fetch(:mday),
    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
end

Method для создания нового экземпляра ActiveSupport::TimeWithZone в часовом поясе self из строки ISO 8601.

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

Если компоненты времени отсутствуют, они будут установлены в ноль.

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

Если строка недействительна, будет поднято исключение ArgumentError, в отличие от parse, которое обычно возвращает nil, при получении недействительной строки даты.

local(*args) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 350
def local(*args)
  time = Time.utc(*args)
  ActiveSupport::TimeWithZone.new(nil, self, time)
end

Method для создания нового экземпляра ActiveSupport::TimeWithZone в часовом поясе self из заданных значений.

Time.zone = 'Hawaii'                    # => "Hawaii"
Time.zone.local(2007, 2, 1, 15, 30, 45) # => Thu, 01 Feb 2007 15:30:45 HST -10:00
local_to_utc(time, dst = true) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 521
def local_to_utc(time, dst = true)
  tzinfo.local_to_utc(time, dst)
end

Корректирует заданное время до одновременного времени в UTC. Возвращает экземпляр Time.utc().

match?(re) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 335
def match?(re)
  (re == name) || (re == MAPPING[name]) ||
    ((Regexp === re) && (re.match?(name) || re.match?(MAPPING[name])))
end

Сравнение name и идентификатора TZInfo с предоставленным регулярным выражением, возвращая true в случае совпадения.

now() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 486
def now
  time_now.utc.in_time_zone(self)
end

Возвращает экземпляр ActiveSupport::TimeWithZone, представляющий текущее время в часовом поясе, представленном self.

Time.zone = 'Hawaii'  # => "Hawaii"
Time.zone.now         # => Wed, 23 Jan 2008 20:24:27 HST -10:00
parse(str, now = now()) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 423
def parse(str, now = now())
  parts_to_time(Date._parse(str, false), now)
end

Method для создания нового экземпляра ActiveSupport::TimeWithZone в часовом поясе self из обработанной строки.

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

Если высшие компоненты отсутствуют в строке, они берутся из 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

Однако, если компонент даты не указан, но указаны любые другие высшие компоненты, то день месяца по умолчанию равен 1:

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

Если строка недействительна, может быть поднято исключение ArgumentError.

period_for_local(time, dst = true) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 533
def period_for_local(time, dst = true)
  tzinfo.period_for_local(time, dst) { |periods| periods.last }
end

Доступно для того, чтобы экземпляры TimeZone реагировали как экземпляры TZInfo::Timezone.

period_for_utc(time) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 527
def period_for_utc(time)
  tzinfo.period_for_utc(time)
end

Доступно для того, чтобы экземпляры TimeZone реагировали как экземпляры TZInfo::Timezone.

rfc3339(str) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 439
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

Method для создания нового экземпляра ActiveSupport::TimeWithZone в часовом поясе self из строки RFC 3339.

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

Если компоненты времени или часового пояса отсутствуют, будет поднято исключение ArgumentError. Это значительно строже, чем parse или iso8601, которые допускают пропущенные компоненты.

Time.zone = 'Hawaii'            # => "Hawaii"
Time.zone.rfc3339('1999-12-31') # => ArgumentError: invalid date
strptime(str, format, now = now()) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 477
def strptime(str, format, now = now())
  parts_to_time(DateTime._strptime(str, format), now)
end

Парсит str в соответствии с format и возвращает ActiveSupport::TimeWithZone.

Предполагает, что str является временем в часовом поясе self, если format не включает явных часовых поясов. (Это такое же поведение, как и у parse.) В любом случае, возвращаемый TimeWithZone имеет часовой пояс 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

Если высшие компоненты отсутствуют в строке, они берутся из 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

Однако, если компонент даты не указан, но указаны любые другие высшие компоненты, то день месяца по умолчанию равен 1:

Time.zone.strptime('Mar 2000', '%b %Y') # => Wed, 01 Mar 2000 00:00:00 HST -10:00
to_s() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 341
def to_s
  "(GMT#{formatted_offset}) #{name}"
end

Возвращает текстовое представление этого часового пояса.

today() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 491
def today
  tzinfo.now.to_date
end

Возвращает текущую дату в этом часовом поясе.

tomorrow() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 496
def tomorrow
  today + 1
end

Возвращает следующую дату в этом часовом поясе.

utc_offset() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 304
def utc_offset
  @utc_offset || tzinfo&.current_period&.base_utc_offset
end

Возвращает смещение этого часового пояса от UTC в секундах.

utc_to_local(time) Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 512
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)
  end
end

Корректирует заданное время до одновременного времени в часовом поясе, представленном self Возвращает местное время с соответствующим смещением — если вам нужен экземпляр ActiveSupport::TimeWithZone, используйте Time#in_time_zone() вместо этого.

Начиная с tzinfo 2, utc_to_local возвращает Time со смещением utc_offset, отличным от нуля. Дополнительная информация содержится в конфигурации `utc_to_local_returns_utc_offset_times`.

yesterday() Показать исходный код
# File activesupport/lib/active_support/values/time_zone.rb, line 501
def yesterday
  today - 1
end

Возвращает предыдущую дату в этом часовом поясе.

© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API