класс DateTime
Публичные методы класса
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 69
def self.civil_from_format(utc_or_local, year, month = 1, day = 1, hour = 0, min = 0, sec = 0)
if utc_or_local.to_sym == :local
offset = ::Time.local(year, month, day).utc_offset.to_r / 86400
else
offset = 0
end
civil(year, month, day, hour, min, sec, offset)
end Возвращает DateTime с локальным смещением для заданного года, если формат локальный, в противном случае смещение равно нулю.
DateTime.civil_from_format :local, 2012 # => Sun, 01 Jan 2012 00:00:00 +0300 DateTime.civil_from_format :local, 2012, 12, 17 # => Mon, 17 Dec 2012 00:00:00 +0000
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 10 def current ::Time.zone ? ::Time.zone.now.to_datetime : ::Time.now.to_datetime end
Возвращает Time.zone.now.to_datetime при установленных Time.zone или config.time_zone, в противном случае возвращает Time.now.to_datetime.
Общедоступные методы экземпляров
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 204
def <=>(other)
if other.respond_to? :to_datetime
super other.to_datetime rescue nil
else
super
end
end Добавляет дополнительное поведение к DateTime#<=>, чтобы объекты Time и ActiveSupport::TimeWithZone можно было сравнивать с объектом DateTime.
# File activesupport/lib/active_support/core_ext/date_time/acts_like.rb, line 8 def acts_like_date? true end
Имитирует поведение класса, подобного Date. См. Object#acts_like?.
# File activesupport/lib/active_support/core_ext/date_time/acts_like.rb, line 13 def acts_like_time? true end
Имитирует поведение класса, подобного Time. См. Object#acts_like?.
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 78
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)
datetime_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?
datetime_advanced_by_date
else
datetime_advanced_by_date.since(seconds_to_advance)
end
end Использует Date для точных расчётов Time по годам, месяцам и дням. Параметр options принимает хеш с любыми из этих ключей: :years, :months, :weeks, :days, :hours, :minutes, :seconds.
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 105 def ago(seconds) since(-seconds) end
Возвращает новый объект DateTime, представляющий время, прошедшее n секунд назад. Не используйте этот метод в сочетании с x.months, используйте months_ago вместо него!
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 118 def beginning_of_day change(hour: 0) end
Возвращает новый объект DateTime, представляющий начало дня (0:00).
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 142 def beginning_of_hour change(min: 0) end
Возвращает новый объект DateTime, представляющий начало часа (hh:00:00).
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 154 def beginning_of_minute change(sec: 0) end
Возвращает новый объект DateTime, представляющий начало минуты (hh:mm:00).
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 51
def change(options)
if new_nsec = options[:nsec]
raise ArgumentError, "Can't change both :nsec and :usec at the same time: #{options.inspect}" if options[:usec]
new_fraction = Rational(new_nsec, 1000000000)
else
new_usec = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000))
new_fraction = Rational(new_usec, 1000000)
end
raise ArgumentError, "argument out of range" if new_fraction >= 1
::DateTime.civil(
options.fetch(:year, year),
options.fetch(:month, month),
options.fetch(:day, day),
options.fetch(:hour, hour),
options.fetch(:min, options[:hour] ? 0 : min),
options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec) + new_fraction,
options.fetch(:offset, offset),
options.fetch(:start, start)
)
end Возвращает новый объект DateTime, в котором одно или несколько элементов были изменены в соответствии с параметром options. Опции времени (:hour, :min, :sec) сбрасываются каскадно, поэтому, если указан только час, то минута и секунда устанавливаются в 0. Если указаны час и минута, то секунда устанавливается в 0. Параметр options принимает хеш с любыми из этих ключей: :year, :month, :day, :hour, :min, :sec, :offset, :start.
DateTime.new(2012, 8, 29, 22, 35, 0).change(day: 1) # => DateTime.new(2012, 8, 1, 22, 35, 0) DateTime.new(2012, 8, 29, 22, 35, 0).change(year: 1981, day: 1) # => DateTime.new(1981, 8, 1, 22, 35, 0) DateTime.new(2012, 8, 29, 22, 35, 0).change(year: 1981, hour: 0) # => DateTime.new(1981, 8, 29, 0, 0, 0)
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 136 def end_of_day change(hour: 23, min: 59, sec: 59, usec: Rational(999999999, 1000)) end
Возвращает новый объект DateTime, представляющий конец дня (23:59:59).
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 148 def end_of_hour change(min: 59, sec: 59, usec: Rational(999999999, 1000)) end
Возвращает новый объект DateTime, представляющий конец часа (hh:59:59).
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 160 def end_of_minute change(sec: 59, usec: Rational(999999999, 1000)) end
Возвращает новый объект DateTime, представляющий конец минуты (hh:mm:59).
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 51 def formatted_offset(colon = true, alternate_utc_string = nil) utc? && alternate_utc_string || ActiveSupport::TimeZone.seconds_to_utc_offset(utc_offset, colon) end
Возвращает отформатированную строку смещения от UTC или альтернативную строку, если часовой пояс уже UTC.
datetime = DateTime.civil(2000, 1, 1, 0, 0, 0, Rational(-6, 24)) datetime.formatted_offset # => "-06:00" datetime.formatted_offset(false) # => "-0600"
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 166
def localtime(utc_offset = nil)
utc = new_offset(0)
Time.utc(
utc.year, utc.month, utc.day,
utc.hour, utc.min, utc.sec + utc.sec_fraction
).getlocal(utc_offset)
end Возвращает экземпляр Time текущего времени в часовом поясе системы.
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 126 def middle_of_day change(hour: 12) end
Возвращает новый объект DateTime, представляющий полдень (12:00).
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 94 def nsec (sec_fraction * 1_000_000_000).to_i end
Возвращает дробную часть секунды в наносекундах.
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 56 def readable_inspect to_s(:rfc822) end
Переопределяет метод inspect для отображения удобочитаемой строки, например, «Пн, 21 фев 2005 14:30:00 +0000».
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 20 def seconds_since_midnight sec + (min * 60) + (hour * 3600) end
Возвращает количество секунд с начала дня (00:00:00).
DateTime.new(2012, 8, 29, 0, 0, 0).seconds_since_midnight # => 0 DateTime.new(2012, 8, 29, 12, 34, 56).seconds_since_midnight # => 45296 DateTime.new(2012, 8, 29, 23, 59, 59).seconds_since_midnight # => 86399
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 29 def seconds_until_end_of_day end_of_day.to_i - to_i end
Возвращает количество секунд до конца дня (23:59:59).
DateTime.new(2012, 8, 29, 0, 0, 0).seconds_until_end_of_day # => 86399 DateTime.new(2012, 8, 29, 12, 34, 56).seconds_until_end_of_day # => 41103 DateTime.new(2012, 8, 29, 23, 59, 59).seconds_until_end_of_day # => 0
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 112 def since(seconds) self + Rational(seconds.round, 86400) end
Возвращает новый объект DateTime, представляющий момент времени, отстоящий на заданное количество секунд от текущего момента. Не используйте этот метод в сочетании с x.months, используйте months_since вместо этого!
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 36 def subsec sec_fraction end
Возвращает дробную часть секунды в виде Rational.
DateTime.new(2012, 8, 29, 0, 0, 0.5).subsec # => (1/2)
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 79 def to_f seconds_since_unix_epoch.to_f + sec_fraction end
Преобразует self в число с плавающей точкой, представляющее количество секунд, включая дробные микросекунды, с эпохи Unix.
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 35
def to_formatted_s(format = :default)
if formatter = ::Time::DATE_FORMATS[format]
formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
else
to_default_s
end
end Преобразует в строку с заданным форматом. См. Time::DATE_FORMATS для предопределенных форматов.
Этот метод является псевдонимом для to_s.
Примеры
datetime = DateTime.civil(2007, 12, 4, 0, 0, 0, 0) # => Tue, 04 Dec 2007 00:00:00 +0000 datetime.to_formatted_s(:db) # => "2007-12-04 00:00:00" datetime.to_s(:db) # => "2007-12-04 00:00:00" datetime.to_s(:number) # => "20071204000000" datetime.to_formatted_s(:short) # => "04 Dec 00:00" datetime.to_formatted_s(:long) # => "December 04, 2007 00:00" datetime.to_formatted_s(:long_ordinal) # => "December 4th, 2007 00:00" datetime.to_formatted_s(:rfc822) # => "Tue, 04 Dec 2007 00:00:00 +0000" datetime.to_formatted_s(:iso8601) # => "2007-12-04T00:00:00+00:00"
Добавление собственных форматов даты и времени в #to_formatted_s
Форматы DateTime совместно используются с Time. Вы можете добавить свои собственные в хэш Time::DATE_FORMATS. Используйте имя формата в качестве ключа хэша и либо строку strftime, либо экземпляр Proc, который принимает время или дату и время в качестве аргумента.
# config/initializers/time_formats.rb
Time::DATE_FORMATS[:month_and_year] = '%B %Y'
Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") }
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 84 def to_i seconds_since_unix_epoch.to_i end
Преобразует self в целое число, представляющее количество секунд с эпохи Unix.
# File activesupport/lib/active_support/core_ext/date_time/compatibility.rb, line 15 def to_time preserve_timezone ? getlocal(utc_offset) : getlocal end
Возвращает экземпляр Time с тем же смещением UTC, что и self, или экземпляр Time, представляющий то же время в местном часовом поясе системы в зависимости от настройки ActiveSupport.to_time_preserves_timezone.
# File activesupport/lib/active_support/core_ext/date_time/conversions.rb, line 89 def usec (sec_fraction * 1_000_000).to_i end
Возвращает дробную часть секунды в микросекундах.
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 180
def utc
utc = new_offset(0)
Time.utc(
utc.year, utc.month, utc.day,
utc.hour, utc.min, utc.sec + utc.sec_fraction
)
end Возвращает экземпляр Time текущего времени в часовом поясе UTC.
DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600 DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 UTC
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 193 def utc? offset == 0 end
Возвращает true, если offset == 0.
# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 198 def utc_offset (offset * 86400).to_i end
Возвращает значение смещения во секундах.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.