класс 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 # => #<TimeZone:0x514834...> Time.zone.name # => "Eastern Time (US & Canada)" Time.zone.now # => Sun, 18 May 2008 14:30:44 EDT -04:00
Версия TZInfo, включенная в Active Support, содержит только определения, необходимые для поддержки зон, определенных классом TimeZone. Если вам нужно использовать зоны, которые не определены классом TimeZone, вам необходимо установить gem TZInfo (если локально установлен недавняя версия gem, она будет использоваться вместо встроенной версии.)
Константы
- MAPPING
-
Ключами являются имена зон Rails TimeZone, значениями — идентификаторы TZInfo.
- UTC_OFFSET_WITHOUT_COLON
- UTC_OFFSET_WITH_COLON
Атрибуты
Публичные методы класса
Находит конкретный объект часового пояса. Если аргумент — строка, она интерпретируется как имя часового пояса для поиска. Если это числовое значение, это либо смещение по часам, либо смещение по секундам часового пояса для поиска. (Будет возвращен первый объект с этим смещением.) Возвращает nil , если такой часовой пояс не известен системе.
# File activesupport/lib/active_support/values/time_zone.rb, line 395
def [](arg)
case arg
when String
begin
@lazy_zones_map[arg] ||= create(arg).tap { |tz| tz.utc_offset }
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 Возвращает массив всех объектов TimeZone. В большинстве случаев на каждый часовой пояс приходится несколько объектов TimeZone для того, чтобы пользователям было проще найти свой часовой пояс.
# File activesupport/lib/active_support/values/time_zone.rb, line 379 def all @zones ||= zones_map.values.sort end
# File activesupport/lib/active_support/values/time_zone.rb, line 362 def self.find_tzinfo(name) TZInfo::TimezoneProxy.new(MAPPING[name] || name) end
Создает новый объект TimeZone с заданным именем и смещением. Смещение — это количество секунд, на которое этот часовой пояс смещен от UTC (GMT). Секунды были выбраны в качестве единицы измерения смещения, потому что именно эта единица используется в Ruby для представления смещений часовых поясов (см. Time#utc_offset).
# File activesupport/lib/active_support/values/time_zone.rb, line 214 def initialize(name, utc_offset = nil, tzinfo = nil) @name = name @utc_offset = utc_offset @tzinfo = tzinfo || TimeZone.find_tzinfo(name) @current_period = nil end
Предполагает, что self представляет смещение от UTC в секундах (как возвращается Time#utc_offset) и преобразует его в строку формата +HH:MM.
TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00"
# File activesupport/lib/active_support/values/time_zone.rb, line 198 def self.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
Удобный метод для возвращения коллекции объектов TimeZone для часовых поясов США.
# File activesupport/lib/active_support/values/time_zone.rb, line 413
def us_zones
@us_zones ||= all.find_all { |z| z.name =~ /US|Arizona|Indiana|Hawaii|Alaska/ }
end # File activesupport/lib/active_support/values/time_zone.rb, line 383
def zones_map
@zones_map ||= begin
MAPPING.each_key {|place| self[place]} # load all the zones
@lazy_zones_map
end
end Общедоступные методы экземпляров
Сравнить часовой пояс с параметром. Сначала сравниваются смещения, а затем — имена.
# File activesupport/lib/active_support/values/time_zone.rb, line 239 def <=>(zone) return unless zone.respond_to? :utc_offset result = (utc_offset <=> zone.utc_offset) result = (name <=> zone.name) if result == 0 result end
Сравнить имя и идентификатор TZInfo с предоставленным регулярным выражением, возвращая true при совпадении.
# File activesupport/lib/active_support/values/time_zone.rb, line 248 def =~(re) re === name || re === MAPPING[name] 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 273 def at(secs) Time.at(secs).utc.in_time_zone(self) end
Возвращает смещение часового пояса в формате строки, например, «+HH:MM».
# File activesupport/lib/active_support/values/time_zone.rb, line 233 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
Метод для создания нового экземпляра 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 262 def local(*args) time = Time.utc(*args) ActiveSupport::TimeWithZone.new(nil, self, time) end
Корректирует заданное время до одновременного времени в UTC. Возвращает экземпляр Time.utc().
# File activesupport/lib/active_support/values/time_zone.rb, line 342 def local_to_utc(time, dst=true) tzinfo.local_to_utc(time, dst) 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 314 def now time_now.utc.in_time_zone(self) 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
# File activesupport/lib/active_support/values/time_zone.rb, line 288
def parse(str, now=now())
parts = Date._parse(str, false)
return if parts.empty?
time = Time.new(
parts.fetch(:year, now.year),
parts.fetch(:mon, now.month),
parts.fetch(:mday, now.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
end Доступен для того, чтобы экземпляры TimeZone отвечали как экземпляры TZInfo::Timezone.
# File activesupport/lib/active_support/values/time_zone.rb, line 354 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 348 def period_for_utc(time) tzinfo.period_for_utc(time) end
Возвращает текстовое представление этого часового пояса.
# File activesupport/lib/active_support/values/time_zone.rb, line 253
def to_s
"(GMT#{formatted_offset}) #{name}"
end Возвращает текущую дату в этом часовом поясе.
# File activesupport/lib/active_support/values/time_zone.rb, line 319 def today tzinfo.now.to_date end
Возвращает следующую дату в этом часовом поясе.
# File activesupport/lib/active_support/values/time_zone.rb, line 324 def tomorrow today + 1 end
Возвращает смещение этого часового пояса от UTC в секундах.
# File activesupport/lib/active_support/values/time_zone.rb, line 222
def utc_offset
if @utc_offset
@utc_offset
else
@current_period ||= tzinfo.try(:current_period)
@current_period.try(:utc_offset)
end
end Корректирует заданное время до одновременного времени в часовом поясе, представленном в self. Возвращает экземпляр Time.utc() – если вам нужен экземпляр ActiveSupport::TimeWithZone, используйте DateAndTime::Zones#in_time_zone вместо этого.
# File activesupport/lib/active_support/values/time_zone.rb, line 336 def utc_to_local(time) tzinfo.utc_to_local(time) end
Возвращает предыдущую дату в этом часовом поясе.
# File activesupport/lib/active_support/values/time_zone.rb, line 329 def yesterday today - 1 end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.