跳到內容 跳到搜尋
方法
#
A
B
C
D
E
F
I
M
N
P
R
S
T
U
Z
包含的模組

常數

COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
 
DATE_FORMATS = { db: "%Y-%m-%d %H:%M:%S", inspect: "%Y-%m-%d %H:%M:%S.%9N %z", number: "%Y%m%d%H%M%S", nsec: "%Y%m%d%H%M%S%9N", usec: "%Y%m%d%H%M%S%6N", time: "%H:%M", short: "%d %b %H:%M", long: "%B %d, %Y %H:%M", long_ordinal: lambda { |time| day_format = ActiveSupport::Inflector.ordinalize(time.day) time.strftime("%B #{day_format}, %Y %H:%M") }, rfc822: lambda { |time| offset_format = time.formatted_offset(false) time.strftime("%a, %d %b %Y %H:%M:%S #{offset_format}") }, iso8601: lambda { |time| time.iso8601 } }
 

屬性

[RW] zone_default

類別公開方法

===(other)

覆寫大小寫相等方法,讓它回傳 true 給 ActiveSupport::TimeWithZone 實例

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 18
def ===(other)
  super || (self == Time && other.is_a?(ActiveSupport::TimeWithZone))
end

at(*args, **kwargs)

也別名為:at_without_coercion
別名為:at_with_coercion

at_with_coercion(*args, **kwargs)

Time.at 上建立額外的行為,讓 ActiveSupport::TimeWithZoneDateTime 實例可以在呼叫時使用單一參數

也別名為:at
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 45
def at_with_coercion(*args, **kwargs)
  return at_without_coercion(*args, **kwargs) if args.size != 1 || !kwargs.empty?

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

  if time_or_number.is_a?(ActiveSupport::TimeWithZone)
    at_without_coercion(time_or_number.to_r).getlocal
  elsif 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_without_coercion(*args, **kwargs)

別名為:at

current()

當設定 Time.zoneconfig.time_zone 時,回傳 Time.zone.now,否則僅回傳 Time.now

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 39
def current
  ::Time.zone ? ::Time.zone.now : ::Time.now
end

days_in_month(month, year = current.year)

傳回給定月份的天數。如果未指定年份,它將使用當前年份。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 24
def days_in_month(month, year = current.year)
  if month == 2 && ::Date.gregorian_leap?(year)
    29
  else
    COMMON_YEAR_DAYS_IN_MONTH[month]
  end
end

days_in_year(year = current.year)

傳回給定年份的天數。如果未指定年份,它將使用當前年份。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 34
def days_in_year(year = current.year)
  days_in_month(2, year) + 337
end

find_zone(time_zone)

傳回與所提供時區相符的 TimeZone 執行個體。接受 Time.zone= 支援的任何格式時區。對於無效時區,傳回 nil

Time.find_zone "America/New_York" # => #<ActiveSupport::TimeZone @name="America/New_York" ...>
Time.find_zone "NOT-A-TIMEZONE"   # => nil
# File activesupport/lib/active_support/core_ext/time/zones.rb, line 93
def find_zone(time_zone)
  find_zone!(time_zone) rescue nil
end

find_zone!(time_zone)

傳回與所提供時區相符的 TimeZone 執行個體。接受 Time.zone= 支援的任何格式時區。對於無效時區,引發 ArgumentError

Time.find_zone! "America/New_York" # => #<ActiveSupport::TimeZone @name="America/New_York" ...>
Time.find_zone! "EST"              # => #<ActiveSupport::TimeZone @name="EST" ...>
Time.find_zone! -5.hours           # => #<ActiveSupport::TimeZone @name="Bogota" ...>
Time.find_zone! nil                # => nil
Time.find_zone! false              # => false
Time.find_zone! "NOT-A-TIMEZONE"   # => ArgumentError: Invalid Timezone: NOT-A-TIMEZONE
# File activesupport/lib/active_support/core_ext/time/zones.rb, line 81
def find_zone!(time_zone)
  return time_zone unless time_zone

  ActiveSupport::TimeZone[time_zone] || raise(ArgumentError, "Invalid Timezone: #{time_zone}")
end

rfc3339(str)

從 RFC 3339 字串建立 Time 執行個體。

Time.rfc3339('1999-12-31T14:00:00-10:00') # => 2000-01-01 00:00:00 -1000

如果時間或偏移元件遺失,將引發 ArgumentError

Time.rfc3339('1999-12-31') # => ArgumentError: invalid date
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 69
def rfc3339(str)
  parts = Date._rfc3339(str)

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

  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)
  )
end

use_zone(time_zone)

允許在提供的區塊內局部覆寫 Time.zone;完成後將 Time.zone 重設為現有值。

class ApplicationController < ActionController::Base
  around_action :set_time_zone

  private
    def set_time_zone
      Time.use_zone(current_user.timezone) { yield }
    end
end

注意:這不會影響任何已建立的 ActiveSupport::TimeWithZone 物件,例如,在區塊之前已讀取的任何模型時間戳屬性將保留在應用程式的預設時區中。

# File activesupport/lib/active_support/core_ext/time/zones.rb, line 61
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(如果已設定,透過 Time.zone=)。如果目前要求尚未設定 Time.zone,則傳回 config.time_zone 中指定的 TimeZone。

# File activesupport/lib/active_support/core_ext/time/zones.rb, line 14
def zone
  ::ActiveSupport::IsolatedExecutionState[:time_zone] || zone_default
end

zone=(時區)

Time.zone 設定為目前要求/執行緒的 TimeZone 物件。

此方法接受下列任何一種

  • Rails TimeZone 物件。

  • Rails TimeZone 物件的識別碼(例如,「東部 Time(美國和加拿大)」、-5.hours)。

  • TZInfo::Timezone 物件。

  • TZInfo::Timezone 物件的識別碼(例如,「America/New_York」)。

以下是一個範例,說明如何針對每個要求設定 Time.zone,並在要求完成時重設。current_user.time_zone 只需要傳回一個識別使用者偏好時區的字串

class ApplicationController < ActionController::Base
  around_action :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 41
def zone=(time_zone)
  ::ActiveSupport::IsolatedExecutionState[:time_zone] = find_zone!(time_zone)
end

實例公開方法

<=>(其他)

別名為:compare_with_coercion

acts_like_time?()

將鴨子型別設定為類似 Time 的類別。請參閱 Object#acts_like?

# File activesupport/lib/active_support/core_ext/time/acts_like.rb, line 7
def acts_like_time?
  true
end

advance(選項)

使用 Date 提供精確的 Time 計算,根據前儒略曆計算年、月和日。options 參數會取得一個雜湊,其中包含下列任一金鑰::years:months:weeks:days:hours:minutes:seconds

Time.new(2015, 8, 1, 14, 35, 0).advance(seconds: 1) # => 2015-08-01 14:35:01 -0700
Time.new(2015, 8, 1, 14, 35, 0).advance(minutes: 1) # => 2015-08-01 14:36:00 -0700
Time.new(2015, 8, 1, 14, 35, 0).advance(hours: 1)   # => 2015-08-01 15:35:00 -0700
Time.new(2015, 8, 1, 14, 35, 0).advance(days: 1)    # => 2015-08-02 14:35:00 -0700
Time.new(2015, 8, 1, 14, 35, 0).advance(weeks: 1)   # => 2015-08-08 14:35:00 -0700

就像 Date#advance 一樣,增量會從最大的時間單位依序套用到最小的時間單位。此順序會影響月底附近的結果。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 202
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.gregorian.advance(options)
  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(秒數)

返回一個新的 時間,表示幾秒鐘前,這基本上是 數字 擴充套件的包裝器

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 228
def ago(seconds)
  since(-seconds)
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()

返回一個新的 時間,表示一天的開始(0:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 241
def beginning_of_day
  change(hour: 0)
end

beginning_of_hour()

返回一個新的 時間,表示小時的開始(x:00)

也別名為:at_beginning_of_hour
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 270
def beginning_of_hour
  change(min: 0)
end

beginning_of_minute()

傳回一個新的 Time,代表分鐘的開始 (x:xx:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 286
def beginning_of_minute
  change(sec: 0)
end

ceil(precision = 0)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 121
def ceil(precision = 0)
  change(nsec: 0) + subsec.ceil(precision)
end

change(options)

傳回一個新的 Time,其中一個或多個元素已根據 options 參數變更。時間選項 (:hour:min:sec:usec:nsec) 會層層重設,因此如果只傳遞小時,則會將分鐘、秒、微秒和奈秒設為 0。如果傳遞小時和分鐘,則會將秒、微秒和奈秒設為 0。options 參數會採用具有下列任一金鑰的雜湊::year:month:day:hour:min:sec:usec:nsec:offset。傳遞 :usec:nsec,不要同時傳遞。

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 138
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_offset = options.fetch(:offset, nil)

  if new_nsec = options[:nsec]
    raise ArgumentError, "Can't change both :nsec and :usec at the same time: #{options.inspect}" if options[:usec]
    new_usec = Rational(new_nsec, 1000)
  else
    new_usec = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000))
  end

  raise ArgumentError, "argument out of range" if new_usec >= 1000000

  new_sec += Rational(new_usec, 1000000)

  if new_offset
    ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, new_offset)
  elsif utc?
    ::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec)
  elsif zone&.respond_to?(:utc_to_local)
    new_time = ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, zone)

    # When there are two occurrences of a nominal time due to DST ending,
    # `Time.new` chooses the first chronological occurrence (the one with a
    # larger UTC offset). However, for `change`, we want to choose the
    # occurrence that matches this time's UTC offset.
    #
    # If the new time's UTC offset is larger than this time's UTC offset, the
    # new time might be a first chronological occurrence. So we add the offset
    # difference to fast-forward the new time, and check if the result has the
    # desired UTC offset (i.e. is the second chronological occurrence).
    offset_difference = new_time.utc_offset - utc_offset
    if offset_difference > 0 && (new_time_2 = new_time + offset_difference).utc_offset == utc_offset
      new_time_2
    else
      new_time
    end
  elsif zone
    ::Time.local(new_sec, new_min, new_hour, new_day, new_month, new_year, nil, nil, isdst, nil)
  else
    ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, utc_offset)
  end
end

compare_with_coercion(other)

Time#<=> 上分層額外的行為,以便 DateTimeActiveSupport::TimeWithZone 執行個體可以與 Time 進行時間順序比較

別名為:<=>
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 332
def compare_with_coercion(other)
  # we're avoiding Time#to_datetime and Time#to_time because they're expensive
  if other.class == Time
    compare_without_coercion(other)
  elsif other.is_a?(Time)
    compare_without_coercion(other.to_time)
  else
    to_datetime <=> other
  end
end

compare_without_coercion(other)

別名為:<=>

end_of_day()

傳回一個新的 Time,代表一天的結束,23:59:59.999999

別名為: at_end_of_day
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 259
def end_of_day
  change(
    hour: 23,
    min: 59,
    sec: 59,
    usec: Rational(999999999, 1000)
  )
end

end_of_hour()

傳回一個新的 Time,代表一小時的結束,x:59:59.999999

別名為: at_end_of_hour
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 276
def end_of_hour
  change(
    min: 59,
    sec: 59,
    usec: Rational(999999999, 1000)
  )
end

end_of_minute()

傳回一個新的 Time,代表一分鐘的結束,x:xx:59.999999

別名為: at_end_of_minute
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 292
def end_of_minute
  change(
    sec: 59,
    usec: Rational(999999999, 1000)
  )
end

eql?(other)

別名為: eql_without_coercion
別名為: eql_with_coercion

eql_with_coercion(other)

Time#eql? 上加上額外的行為,以便 ActiveSupport::TimeWithZone 執行個體可以 eql? 等同於 Time

別名為: eql?
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 347
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_without_coercion(other)

別名為: eql?

floor(precision = 0)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 112
def floor(precision = 0)
  change(nsec: 0) + subsec.floor(precision)
end

formatted_offset(colon = true, alternate_utc_string = nil)

傳回一個格式化的字串,表示與 UTC 的時差,或如果時區已經是 UTC,則傳回一個替代字串。

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 69
def formatted_offset(colon = true, alternate_utc_string = nil)
  utc? && alternate_utc_string || ActiveSupport::TimeZone.seconds_to_utc_offset(utc_offset, colon)
end

in(秒)

別名為:since

midday()

別名為:middle_of_day

middle_of_day()

傳回一個新的 Time,代表一天的中午(12:00)

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 249
def middle_of_day
  change(hour: 12)
end

midnight()

別名為:beginning_of_day

minus_with_coercion(other)

Time#- 也可以用來判斷兩個 Time 實例之間的秒數。我們會加上額外的行為,讓 ActiveSupport::TimeWithZone 實例轉換為 Time#- 會辨識的值

別名為:-
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 323
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)

別名為:-

next_day(days = 1)

傳回一個新的時間,代表未來指定天數的時間。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 361
def next_day(days = 1)
  advance(days: days)
end

next_month(months = 1)

傳回一個新的時間,在指定的月份數後。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 371
def next_month(months = 1)
  advance(months: months)
end

next_year(years = 1)

傳回一個新的時間,在指定的年數後。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 381
def next_year(years = 1)
  advance(years: years)
end

noon()

別名為:middle_of_day

prev_day(days = 1)

傳回一個新的時間,在指定的天數前。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 356
def prev_day(days = 1)
  advance(days: -days)
end

prev_month(months = 1)

傳回一個新的時間,在指定的月數前。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 366
def prev_month(months = 1)
  advance(months: -months)
end

prev_year(years = 1)

傳回一個新的時間,在指定的年數前。

# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 376
def prev_year(years = 1)
  advance(years: -years)
end

sec_fraction()

傳回秒數的分數,作為 Rational

Time.new(2012, 8, 29, 0, 0, 0.5).sec_fraction # => (1/2)
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 107
def sec_fraction
  subsec
end

seconds_since_midnight()

傳回自 00:00:00 以來的秒數。

Time.new(2012, 8, 29,  0,  0,  0).seconds_since_midnight # => 0.0
Time.new(2012, 8, 29, 12, 34, 56).seconds_since_midnight # => 45296.0
Time.new(2012, 8, 29, 23, 59, 59).seconds_since_midnight # => 86399.0
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 91
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 100
def seconds_until_end_of_day
  end_of_day.to_i - to_i
end

since(seconds)

傳回一個新的 Time,表示自實例時間以來經過的秒數

別名為:in
# File activesupport/lib/active_support/core_ext/time/calculations.rb, line 233
def since(seconds)
  self + seconds
rescue
  to_datetime.since(seconds)
end

to_formatted_s(format = :default)

別名為:to_fs

to_fs(format = :default)

轉換為格式化字串。請參閱 DATE_FORMATS 以取得內建格式。

此方法的別名為 to_formatted_s

time = Time.now                    # => 2007-01-18 06:10:17 -06:00

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

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

將您自己的時間格式新增至 to_fs

您可以將您自己的格式新增至 Time::DATE_FORMATS hash。使用格式名稱作為 hash 鍵,並使用 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}") }
別名為:to_formatted_s
# File activesupport/lib/active_support/core_ext/time/conversions.rb, line 53
def to_fs(format = :default)
  if formatter = DATE_FORMATS[format]
    formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
  else
    to_s
  end
end

to_time()

根據 ActiveSupport.to_time_preserves_timezone 的設定,傳回 self 或當地系統時區的時間。

# File activesupport/lib/active_support/core_ext/time/compatibility.rb, line 13
def to_time
  preserve_timezone ? self : getlocal
end