Spec-Zone.ru › Ruby on Rails 4.1

класс Time

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

Константы

COMMON_YEAR_DAYS_IN_MONTH
DATE_FORMATS

Атрибуты

zone_default[RW]

Открытые методы класса

===(other) Показать исходный код

Переопределение метода сравнения по равенству, чтобы возвращать true для экземпляров ActiveSupport::TimeWithZone

Вызывает метод суперкласса
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 14
def ===(other)
  super || (self == Time && other.is_a?(ActiveSupport::TimeWithZone))
end
_load(marshaled_time) Показать исходный код
# File activesupport/lib/active_support/core_ext/time/marshal.rb, line 8
def _load(marshaled_time)
  time = _load_without_zone(marshaled_time)
  time.instance_eval do
    if zone = defined?(@_zone) && remove_instance_variable('@_zone')
      ary = to_a
      ary[0] += subsec if ary[0] == sec
      ary[-1] = zone
      utc? ? Time.utc(*ary) : Time.local(*ary)
    else
      self
    end
  end
end
Также алиасирован как: _load_without_zone
_load_without_zone(marshaled_time)
Псевдоним для: _load
at(*args)
Также алиасирован как: at_without_coercion
Псевдоним для: at_with_coercion
at_with_coercion(*args) Показать исходный код

Добавляет дополнительные возможности к ::at, чтобы экземпляры ActiveSupport::TimeWithZone и DateTime можно было использовать при вызове с одним аргументом

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 35
def at_with_coercion(*args)
  return at_without_coercion(*args) if args.size != 1

  # Time.at can be called with a time or numerical value
  time_or_number = args.first

  if time_or_number.is_a?(ActiveSupport::TimeWithZone) || time_or_number.is_a?(DateTime)
    at_without_coercion(time_or_number.to_f).getlocal
  else
    at_without_coercion(time_or_number)
  end
end
Также алиасирован как: at
at_without_coercion(*args)
Псевдоним для: at
current() Показать исходный код

Возвращает Time.zone.now при Time.zone или config.time_zone, в противном случае просто возвращает Time.now.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 29
def current
  ::Time.zone ? ::Time.zone.now : ::Time.now
end
days_in_month(month, year = now.year) Показать исходный код

Возвращает количество дней в данном месяце. Если год не указан, используется текущий год.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 20
def days_in_month(month, year = now.year)
  if month == 2 && ::Date.gregorian_leap?(year)
    29
  else
    COMMON_YEAR_DAYS_IN_MONTH[month]
  end
end
find_zone(time_zone) Показать исходный код
# File activesupport/lib/active_support/core_ext/time/zones.rb, line 75
def find_zone(time_zone)
  find_zone!(time_zone) rescue nil
end
find_zone!(time_zone) Показать исходный код

Возвращает экземпляр TimeZone или nil, или вызывает ArgumentError для неверных часовых поясов.

# File activesupport/lib/active_support/core_ext/time/zones.rb, line 55
def find_zone!(time_zone)
  if !time_zone || time_zone.is_a?(ActiveSupport::TimeZone)
    time_zone
  else
    # lookup timezone based on identifier (unless we've been passed a TZInfo::Timezone)
    unless time_zone.respond_to?(:period_for_local)
      time_zone = ActiveSupport::TimeZone[time_zone] || TZInfo::Timezone.get(time_zone)
    end

    # Return if a TimeZone instance, or wrap in a TimeZone instance if a TZInfo::Timezone
    if time_zone.is_a?(ActiveSupport::TimeZone)
      time_zone
    else
      ActiveSupport::TimeZone.create(time_zone.name, nil, time_zone)
    end
  end
rescue TZInfo::InvalidTimezoneIdentifier
  raise ArgumentError, "Invalid Timezone: #{time_zone}"
end
use_zone(time_zone) { || ... } Показать исходный код

Позволяет локально переопределить Time.zone внутри переданного блока; восстанавливает значение Time.zone к исходному значению по завершении.

# File activesupport/lib/active_support/core_ext/time/zones.rb, line 44
def use_zone(time_zone)
  new_zone = find_zone!(time_zone)
  begin
    old_zone, ::Time.zone = ::Time.zone, new_zone
    yield
  ensure
    ::Time.zone = old_zone
  end
end
zone() Показать исходный код

Возвращает TimeZone для текущего запроса, если он был задан (через ::zone=). Если Time.zone не был установлен для текущего запроса, возвращает TimeZone, указанный в config.time_zone.

# File activesupport/lib/active_support/core_ext/time/zones.rb, line 12
def zone
  Thread.current[:time_zone] || zone_default
end
zone=(time_zone) Показать исходный код

Устанавливает Time.zone на объект TimeZone для текущего запроса/потока.

Этот метод принимает следующие значения:

  • Объект Rails TimeZone.

  • Идентификатор объекта Rails TimeZone (например, «Eastern Время (США и Канада)», -5.hours).

  • Объект TZInfo::Timezone.

  • Идентификатор объекта TZInfo::Timezone (например, «America/New_York»).

Вот пример, как вы можете установить Time.zone для каждого запроса и сбросить его по завершении запроса. current_user.time_zone просто должен вернуть строку, идентифицирующую предпочтительный часовой пояс пользователя:

class ApplicationController < ActionController::Base
  around_filter :set_time_zone

  def set_time_zone
    if logged_in?
      Time.use_zone(current_user.time_zone) { yield }
    else
      yield
    end
  end
end
# File activesupport/lib/active_support/core_ext/time/zones.rb, line 39
def zone=(time_zone)
  Thread.current[:time_zone] = find_zone!(time_zone)
end

Методы публичного экземпляра

-(другой)
Также алиасируется как: minus_without_duration, minus_without_coercion
Псевдоним для: minus_with_coercion
<=>(другой)
Также алиасируется как: compare_without_coercion
Псевдоним для: compare_with_coercion
_dump(*аргументы) Показать исходный код
# File activesupport/lib/active_support/core_ext/time/marshal.rb, line 24
def _dump(*args)
  obj = dup
  obj.instance_variable_set('@_zone', zone)
  obj.send :_dump_without_zone, *args
end
Также алиасируется как: _dump_without_zone
_dump_without_zone(*аргументы)
Псевдоним для: _dump
acts_like_time?() Показать исходный код

Имитирует класс типа Time. См. Object#acts_like?.

# File activesupport/lib/active_support/core_ext/time/acts_like.rb, line 5
def acts_like_time?
  true
end
advance(опции) Показать исходный код

Использует Date для предоставления точных вычислений Time на годы, месяцы и дни в соответствии с пролептическим григорианским календарем. Параметр options принимает хэш с любым из этих ключей: :years, :months, :weeks, :days, :hours, :minutes, :seconds.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 99
def advance(options)
  unless options[:weeks].nil?
    options[:weeks], partial_weeks = options[:weeks].divmod(1)
    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks
  end

  unless options[:days].nil?
    options[:days], partial_days = options[:days].divmod(1)
    options[:hours] = options.fetch(:hours, 0) + 24 * partial_days
  end

  d = to_date.advance(options)
  d = d.gregorian if d.julian?
  time_advanced_by_date = change(:year => d.year, :month => d.month, :day => d.day)
  seconds_to_advance =        options.fetch(:seconds, 0) +
    options.fetch(:minutes, 0) * 60 +
    options.fetch(:hours, 0) * 3600

  if seconds_to_advance.zero?
    time_advanced_by_date
  else
    time_advanced_by_date.since(seconds_to_advance)
  end
end
ago(секунды) Показать исходный код

Возвращает новый Time, представляющий время, на заданное количество секунд назад. Это в основном обёртка вокруг расширения Numeric.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 126
def ago(seconds)
  since(-seconds)
end
all_day() Показать исходный код

Возвращает Range, представляющий весь день текущего времени.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 200
def all_day
  beginning_of_day..end_of_day
end
at_beginning_of_day()
Псевдоним для: beginning_of_day
at_beginning_of_hour()
Псевдоним для: beginning_of_hour
at_beginning_of_minute()
Псевдоним для: beginning_of_minute
at_end_of_day()
Псевдоним для: end_of_day
at_end_of_hour()
Псевдоним для: end_of_hour
at_end_of_minute()
Псевдоним для: end_of_minute
at_midday()
Псевдоним для: middle_of_day
at_middle_of_day()
Псевдоним для: middle_of_day
at_midnight()
Псевдоним для: beginning_of_day
at_noon()
Псевдоним для: middle_of_day
beginning_of_day() Показать исходный код

Возвращает новый Time, представляющий начало дня (0:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 139
def beginning_of_day
  #(self - seconds_since_midnight).change(usec: 0)
  change(:hour => 0)
end
Также алиасируется как: midnight, at_midnight, at_beginning_of_day
beginning_of_hour() Показать исходный код

Возвращает новый Time, представляющий начало часа (x:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 169
def beginning_of_hour
  change(:min => 0)
end
Также алиасируется как: at_beginning_of_hour
beginning_of_minute() Показать исходный код

Возвращает новый Time, представляющий начало минуты (x:xx:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 185
def beginning_of_minute
  change(:sec => 0)
end
Также алиасируется как: at_beginning_of_minute
change(опции) Показать исходный код

Возвращает новый Time, где один или несколько элементов были изменены в соответствии с параметром options. Параметр времени (:hour, :min, :sec, :usec) сбрасывает значения каскадно. Например, если передать только час, то минута, секунда и микросекунда установятся в 0. Если передать час и минуту, то секунда и микросекунда установятся в 0. Параметр options принимает хэш с любым из этих ключей: :year, :month, :day, :hour, :min, :sec, :usec.

Time.new(2012, 8, 29, 22, 35, 0).change(day: 1)              # => Time.new(2012, 8, 1, 22, 35, 0)
Time.new(2012, 8, 29, 22, 35, 0).change(year: 1981, day: 1)  # => Time.new(1981, 8, 1, 22, 35, 0)
Time.new(2012, 8, 29, 22, 35, 0).change(year: 1981, hour: 0) # => Time.new(1981, 8, 29, 0, 0, 0)
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 76
def change(options)
  new_year  = options.fetch(:year, year)
  new_month = options.fetch(:month, month)
  new_day   = options.fetch(:day, day)
  new_hour  = options.fetch(:hour, hour)
  new_min   = options.fetch(:min, options[:hour] ? 0 : min)
  new_sec   = options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec)
  new_usec  = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000))

  if utc?
    ::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec, new_usec)
  elsif zone
    ::Time.local(new_year, new_month, new_day, new_hour, new_min, new_sec, new_usec)
  else
    ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec + (new_usec.to_r / 1000000), utc_offset)
  end
end
compare_with_coercion(другой) Показать исходный код

Добавляет дополнительное поведение к Time#<=> для того, чтобы экземпляры DateTime и ActiveSupport::TimeWithZone можно было сравнивать по времени с экземпляром Time.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 236
def compare_with_coercion(other)
  # we're avoiding Time#to_datetime cause it's expensive
  if other.is_a?(Time)
    compare_without_coercion(other.to_time)
  else
    to_datetime <=> other
  end
end
Также алиасируется как: <=>
compare_without_coercion(другой)
Псевдоним для: <=>
end_of_day() Показать исходный код

Возвращает новый Time, представляющий конец дня, 23:59:59.999999 (.999999999 в ruby1.9)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 158
def end_of_day
  change(
    :hour => 23,
    :min => 59,
    :sec => 59,
    :usec => Rational(999999999, 1000)
  )
end
Также алиасируется как: at_end_of_day
end_of_hour() Показать исходный код

Возвращает новый объект Time, представляющий конец часа, x:59:59.999999 (.999999999 в ruby1.9)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 175
def end_of_hour
  change(
    :min => 59,
    :sec => 59,
    :usec => Rational(999999999, 1000)
  )
end
Также алиасируется как: at_end_of_hour
end_of_minute() Показать исходный код

Возвращает новый объект Time, представляющий конец минуты, x:xx:59.999999 (.999999999 в ruby1.9)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 191
def end_of_minute
  change(
    :sec => 59,
    :usec => Rational(999999999, 1000)
  )
end
Также алиасируется как: at_end_of_minute
eql?(other)
Также алиасируется как: eql_without_coercion
Псевдоним для: eql_with_coercion
eql_with_coercion(other) Показать исходный код

Добавляет дополнительное поведение к #eql?, чтобы объекты ActiveSupport::TimeWithZone могли быть eql? эквивалентному объекту Time

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 249
def eql_with_coercion(other)
  # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison
  other = other.comparable_time if other.respond_to?(:comparable_time)
  eql_without_coercion(other)
end
Также алиасируется как: eql?
eql_without_coercion(other)
Псевдоним для: eql?
formatted_offset(colon = true, alternate_utc_string = nil) Показать исходный код

Возвращает смещение UTC в формате +HH:MM.

Time.local(2000).formatted_offset        # => "-06:00"
Time.local(2000).formatted_offset(false) # => "-0600"
# File activesupport/lib/active_support/core_ext/time/conversions.rb, line 62
def formatted_offset(colon = true, alternate_utc_string = nil)
  utc? && alternate_utc_string || ActiveSupport::TimeZone.seconds_to_utc_offset(utc_offset, colon)
end
in(seconds)
Псевдоним для: since
midday()
Псевдоним для: middle_of_day
middle_of_day() Показать исходный код

Возвращает новый объект Time, представляющий полдень (12:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 148
def middle_of_day
  change(:hour => 12)
end
Также алиасируется как: midday, noon, at_midday, at_noon, at_middle_of_day
midnight()
Псевдоним для: beginning_of_day
minus_with_coercion(other) Показать исходный код

Time#- также может использоваться для определения количества секунд между двумя объектами Time. Мы добавляем дополнительное поведение, чтобы объекты ActiveSupport::TimeWithZone были приведены к типу, распознаваемому Time#-.

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 227
def minus_with_coercion(other)
  other = other.comparable_time if other.respond_to?(:comparable_time)
  other.is_a?(DateTime) ? to_f - other.to_f : minus_without_coercion(other)
end
Также алиасируется как: -
minus_without_coercion(other)
Псевдоним для: -
minus_without_duration(other)
Псевдоним для: -
noon()
Псевдоним для: middle_of_day
seconds_since_midnight() Показать исходный код

Секунды с полуночи: Time.now.seconds_since_midnight

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 52
def seconds_since_midnight
  to_i - change(:hour => 0).to_i + (usec / 1.0e+6)
end
seconds_until_end_of_day() Показать исходный код

Возвращает количество секунд до 23:59:59.

Time.new(2012, 8, 29,  0,  0,  0).seconds_until_end_of_day # => 86399
Time.new(2012, 8, 29, 12, 34, 56).seconds_until_end_of_day # => 41103
Time.new(2012, 8, 29, 23, 59, 59).seconds_until_end_of_day # => 0
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 61
def seconds_until_end_of_day
  end_of_day.to_i - to_i
end
since(seconds) Показать исходный код

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

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 131
def since(seconds)
  self + seconds
rescue
  to_datetime.since(seconds)
end
Также алиасируется как: in
to_default_s(format = :default)
Псевдоним для: to_s
to_formatted_s(format = :default) Показать исходный код

Преобразует объект в строку с форматом. См. DATE_FORMATS для встроенных форматов.

Этот метод является алиасом для to_s.

time = Time.now                    # => Thu Jan 18 06:10:17 CST 2007

time.to_formatted_s(:time)         # => "06:10"
time.to_s(:time)                   # => "06:10"

time.to_formatted_s(:db)           # => "2007-01-18 06:10:17"
time.to_formatted_s(:number)       # => "20070118061017"
time.to_formatted_s(:short)        # => "18 Jan 06:10"
time.to_formatted_s(:long)         # => "January 18, 2007 06:10"
time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10"
time.to_formatted_s(:rfc822)       # => "Thu, 18 Jan 2007 06:10:17 -0600"
time.to_formatted_s(:iso8601)      # => "2007-01-18T06:10:17-06:00"

Добавление собственных форматов времени в to_formatted_s

Вы можете добавить собственные форматы в хэш Time::DATE_FORMATS. Используйте имя формата в качестве ключа хэша и либо строку strftime, либо экземпляр Proc, принимающий время в качестве аргумента.

# config/initializers/time_formats.rb
Time::DATE_FORMATS[:month_and_year] = '%B %Y'
Time::DATE_FORMATS[:short_ordinal]  = ->(time) { time.strftime("%B #{time.day.ordinalize}") }
# File activesupport/lib/active_support/core_ext/time/conversions.rb, line 48
def to_formatted_s(format = :default)
  if formatter = DATE_FORMATS[format]
    formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
  else
    to_default_s
  end
end
Также алиасируется как: to_s
to_s(format = :default)
Также алиасируется как: to_default_s
Псевдоним для: to_formatted_s

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

Spec-Zone.ru

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