класс ActiveSupport::TimeZone
Класс TimeZone служит оболочкой над экземплярами TZInfo::Timezone. Он позволяет:
-
Ограничить набор доступных часовых поясов, предоставленных TZInfo, до значимой подвыборки из 146 поясов.
-
Получить и отобразить часовые пояса с более дружественным названием (например, «Восточное время (США и Канада)» вместо «America/New_York»).
-
Лениво загружать экземпляры TZInfo::Timezone только тогда, когда они необходимы.
-
Создавать экземпляры ActiveSupport::TimeWithZone с помощью методов класса TimeZone:
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.
- UTC_OFFSET_WITHOUT_COLON
- UTC_OFFSET_WITH_COLON
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/values/time_zone.rb, line 227
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 , если такой часовой пояс не известен системе.
# File activesupport/lib/active_support/values/time_zone.rb, line 251 def country_zones(country_code) code = country_code.to_s.upcase @country_zones[code] ||= load_country_zones(code) end
Удобный метод для возврата набора объектов TimeZone для часовых поясов в стране, заданной ее кодом ISO 3166-1 Alpha2.
# File activesupport/lib/active_support/values/time_zone.rb, line 202 def find_tzinfo(name) TZInfo::Timezone.new(MAPPING[name] || name) end
# File activesupport/lib/active_support/values/time_zone.rb, line 211 def new(name) self[name] end
Возвращает экземпляр TimeZone с заданным именем или nil, если такой экземпляр TimeZone не существует. (Это необходимо для поддержки использования этого класса с макросом composed_of.)
# File activesupport/lib/active_support/values/time_zone.rb, line 287 def initialize(name, utc_offset = nil, tzinfo = nil) @name = name @utc_offset = utc_offset @tzinfo = tzinfo || TimeZone.find_tzinfo(name) end
Создает новый объект TimeZone с заданным именем и смещением. Смещение — это количество секунд, на которое этот часовой пояс смещен от UTC (GMT). Секунды выбраны в качестве единицы смещения, потому что именно эту единицу Ruby использует для представления смещений часовых поясов (см. Time#utc_offset).
# File activesupport/lib/active_support/values/time_zone.rb, line 194 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"
# File activesupport/lib/active_support/values/time_zone.rb, line 245 def us_zones country_zones(:us) end
Удобный метод для возврата набора объектов TimeZone для часовых поясов в США.
Общедоступные методы экземпляров
# File activesupport/lib/active_support/values/time_zone.rb, line 314 def <=>(zone) return unless zone.respond_to? :utc_offset result = (utc_offset <=> zone.utc_offset) result = (name <=> zone.name) if result == 0 result end
Сравните эту временную зону с параметром. Сначала сравниваются смещения, а затем — имена.
# File activesupport/lib/active_support/values/time_zone.rb, line 323 def =~(re) re === name || re === MAPPING[name] end
Сравните имя и идентификатор TZInfo с заданным регулярным выражением, возвращая true в случае совпадения.
# File activesupport/lib/active_support/values/time_zone.rb, line 348 def at(secs) Time.at(secs).utc.in_time_zone(self) end
Метод для создания нового экземпляра 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
# File activesupport/lib/active_support/values/time_zone.rb, line 308 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"
# File activesupport/lib/active_support/values/time_zone.rb, line 337 def local(*args) time = Time.utc(*args) ActiveSupport::TimeWithZone.new(nil, self, time) end
Метод для создания нового экземпляра 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
# File activesupport/lib/active_support/values/time_zone.rb, line 429 def local_to_utc(time, dst=true) tzinfo.local_to_utc(time, dst) end
Корректирует заданное время до одновременного времени в UTC. Возвращает экземпляр Time.utc().
# File activesupport/lib/active_support/values/time_zone.rb, line 401 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
# File activesupport/lib/active_support/values/time_zone.rb, line 368 def parse(str, now=now()) parts_to_time(Date._parse(str, false), now) end
Метод для создания нового экземпляра 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
Если верхние компоненты отсутствуют в строке, они берутся из #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
# File activesupport/lib/active_support/values/time_zone.rb, line 441 def period_for_local(time, dst=true) tzinfo.period_for_local(time, dst) end
Доступно для того, чтобы экземпляры TimeZone реагировали как экземпляры TZInfo::Timezone.
# File activesupport/lib/active_support/values/time_zone.rb, line 435 def period_for_utc(time) tzinfo.period_for_utc(time) end
Доступно для того, чтобы экземпляры TimeZone реагировали как экземпляры TZInfo::Timezone.
# File activesupport/lib/active_support/values/time_zone.rb, line 392 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
Если верхние компоненты отсутствуют в строке, они берутся из #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
# File activesupport/lib/active_support/values/time_zone.rb, line 328
def to_s
"(GMT#{formatted_offset}) #{name}"
end Возвращает текстовое представление этой временной зоны.
# File activesupport/lib/active_support/values/time_zone.rb, line 406 def today tzinfo.now.to_date end
Возвращает текущую дату в этой временной зоне.
# File activesupport/lib/active_support/values/time_zone.rb, line 411 def tomorrow today + 1 end
Возвращает следующую дату в этой временной зоне.
# File activesupport/lib/active_support/values/time_zone.rb, line 294
def utc_offset
if @utc_offset
@utc_offset
else
tzinfo.current_period.utc_offset if tzinfo && tzinfo.current_period
end
end Возвращает смещение этой временной зоны от UTC в секундах.
# File activesupport/lib/active_support/values/time_zone.rb, line 423 def utc_to_local(time) tzinfo.utc_to_local(time) end
Корректирует заданное время до одновременного времени во временной зоне, представленной self. Возвращает экземпляр Time.utc() – если вам нужен экземпляр ActiveSupport::TimeWithZone, используйте DateAndTime::Zones#in_time_zone вместо этого.
# File activesupport/lib/active_support/values/time_zone.rb, line 416 def yesterday today - 1 end
Возвращает предыдущую дату в этой временной зоне.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.