類別時間

時間 物件表示日期和時間

Time.new(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 -0600

雖然其值可以用單一數字表示(請參閱下方的 Epoch 秒數),但按部分處理值會比較方便

t = Time.new(-2000, 1, 1, 0, 0, 0.0)
# => -2000-01-01 00:00:00 -0600
t.year # => -2000
t.month # => 1
t.mday # => 1
t.hour # => 0
t.min # => 0
t.sec # => 0
t.subsec # => 0

t = Time.new(2000, 12, 31, 23, 59, 59.5)
# => 2000-12-31 23:59:59.5 -0600
t.year # => 2000
t.month # => 12
t.mday # => 31
t.hour # => 23
t.min # => 59
t.sec # => 59
t.subsec # => (1/2)

Epoch 秒數

Epoch 秒數 是自 Unix Epoch(1970 年 1 月 1 日)以來的確切秒數(包含小數秒數)。

您可以使用 時間.to_r 方法準確擷取該值

Time.at(0).to_r        # => (0/1)
Time.at(0.999999).to_r # => (9007190247541737/9007199254740992)

例如 Time#to_iTime#to_f 等其他擷取方法可能會傳回捨入或截斷子秒數的值。

時間解析度

從系統時鐘衍生的 Time 物件(例如,透過方法 Time.now)具有系統支援的解析度。

範例

所有這些範例都是使用 EST 時區(GMT-5)執行的。

建立新的 Time 實例

您可以使用 Time.new 建立 Time 的新實例。這將使用目前的系統時間。 Time.now 是此別名。您也可以將時間的部分傳遞給 Time.new,例如年、月、分等。當您想要以這種方式建構時間時,您必須至少傳遞一個年。如果您只傳遞年而沒有其他內容,時間將預設為該年的 1 月 1 日,時間為 00:00:00,時區為目前的系統時區。以下是幾個範例

Time.new(2002)         #=> 2002-01-01 00:00:00 -0500
Time.new(2002, 10)     #=> 2002-10-01 00:00:00 -0500
Time.new(2002, 10, 31) #=> 2002-10-31 00:00:00 -0500

您可以傳遞 UTC 偏移量

Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200

時區物件

zone = timezone("Europe/Athens")      # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200

您也可以使用 Time.localTime.utc 來推斷當地和 UTC 時區,而不是使用目前的系統設定。

您也可以使用 Time.at 建立新的時間,它會取得 Unix 紀元 以來的秒數(含子秒數)。

Time.at(628232400) #=> 1989-11-28 00:00:00 -0500

使用 Time 實例

取得 Time 實例後,您可以對它執行許多操作。以下是幾個範例。對於以下所有範例,我們將假設您已執行下列操作

t = Time.new(1993, 02, 24, 12, 0, 0, "+09:00")

那時星期一嗎?

t.monday? #=> false

那年是哪一年?

t.year #=> 1993

那時是日光節約時間嗎?

t.dst? #=> false

一年後是哪一天?

t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900

自 Unix 紀元以來,那是多少秒?

t.to_i #=> 730522800

您也可以執行標準函數,例如比較兩個時間。

t1 = Time.new(2010)
t2 = Time.new(2011)

t1 == t2 #=> false
t1 == t1 #=> true
t1 <  t2 #=> true
t1 >  t2 #=> false

Time.new(2010,10,31).between?(t1, t2) #=> true

此處內容

首先,其他地方的內容。類別 Time

在此,類別 Time 提供下列方法,對下列事項很有用:

建立方法

擷取方法

查詢方法

用於比較的函式

用於轉換的函式

用於四捨五入的函式

有關參數 zone 的形式,請參閱 時區規格

時區規格

某些 Time 函式接受指定時區的參數

在其中任何一個參數中給定的值都必須符合下列其中一項(下方詳細說明)

小時/分鐘偏移量

時區值可能是從 UTC 偏移的字串,格式為 '+HH:MM''-HH:MM',其中

範例

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: '-23:59')            # => 1999-12-31 20:16:01 -2359
Time.at(t, in: '+23:59')            # => 2000-01-02 20:14:01 +2359

單字母偏移量

時區值可能是範圍在 'A'..'I''K'..'Z' 的字母;請參閱 軍事時區清單

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: 'A')                 # => 2000-01-01 21:15:01 +0100
Time.at(t, in: 'I')                 # => 2000-01-02 05:15:01 +0900
Time.at(t, in: 'K')                 # => 2000-01-02 06:15:01 +1000
Time.at(t, in: 'Y')                 # => 2000-01-01 08:15:01 -1200
Time.at(t, in: 'Z')                 # => 2000-01-01 20:15:01 UTC

整數偏移量

時區值可能是範圍在 -86399..86399 的整數秒數

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: -86399)              # => 1999-12-31 20:15:02 -235959
Time.at(t, in: 86399)               # => 2000-01-02 20:15:00 +235959

時區物件

時區值可能是回應某些時區方法的物件,例如 TimezoneTZInfo 的執行個體。

時區方法為

自訂時區類別可能有這些執行個體方法,如果已定義,會呼叫這些方法

Time 類似物件

Time 類似物件是容器物件,能夠與時區函式庫介面進行時區轉換。

上述時區轉換方法的引數會有類似於 Time 的屬性,但與時區相關的屬性沒有意義。

時區物件的 local_to_utcutc_to_local 方法傳回的物件可能是與其引數相同的類別、任意物件類別或 Integer 類別。

對於 Integer 以外的傳回類別,類別必須有下列方法

對於回傳的 整數,其組成部分在 UTC 中分解,會被解釋為指定時區中的時間。

時區名稱

如果類別(類別方法的接收者,或實例方法的接收者類別)有 find_timezone 單例方法,則會呼叫此方法從時區名稱取得對應的時區物件。

例如,使用 Timezone

class TimeWithTimezone < Time
  require 'timezone'
  def self.find_timezone(z) = Timezone[z]
end

TimeWithTimezone.now(in: "America/New_York")        #=> 2023-12-25 00:00:00 -0500
TimeWithTimezone.new("2023-12-25 America/New_York") #=> 2023-12-25 00:00:00 -0500

或使用 TZInfo

class TimeWithTZInfo < Time
  require 'tzinfo'
  def self.find_timezone(z) = TZInfo::Timezone.get(z)
end

TimeWithTZInfo.now(in: "America/New_York")          #=> 2023-12-25 00:00:00 -0500
TimeWithTZInfo.new("2023-12-25 America/New_York")   #=> 2023-12-25 00:00:00 -0500

您可以針對每個子類別定義此方法,或在頂層 時間 類別中定義。

常數

VERSION

公開類別方法

at(時間, 子秒 = false, 單位 = :微秒, in: nil) 按一下以切換來源

根據給定的引數回傳一個新的 時間 物件。

必要的引數 時間 可以是下列任一者

  • 一個 時間 物件,其值是回傳時間的基礎;也受選擇性的關鍵字引數 in: 影響(請參閱下方)。

  • 回傳時間的 Epoch 秒數

範例

t = Time.new(2000, 12, 31, 23, 59, 59) # => 2000-12-31 23:59:59 -0600
secs = t.to_i                          # => 978328799
Time.at(secs)                          # => 2000-12-31 23:59:59 -0600
Time.at(secs + 0.5)                    # => 2000-12-31 23:59:59.5 -0600
Time.at(1000000000)                    # => 2001-09-08 20:46:40 -0500
Time.at(0)                             # => 1969-12-31 18:00:00 -0600
Time.at(-1000000000)                   # => 1938-04-24 17:13:20 -0500

選擇性的數字引數 子秒 和選擇性的符號引數 單位 會一起用來指定回傳時間的子秒;引數 單位 指定 子秒 的單位

  • :毫秒子秒 以毫秒為單位

    Time.at(secs, 0, :millisecond)     # => 2000-12-31 23:59:59 -0600
    Time.at(secs, 500, :millisecond)   # => 2000-12-31 23:59:59.5 -0600
    Time.at(secs, 1000, :millisecond)  # => 2001-01-01 00:00:00 -0600
    Time.at(secs, -1000, :millisecond) # => 2000-12-31 23:59:58 -0600
    
  • :微秒:微秒子秒 以微秒為單位

    Time.at(secs, 0, :microsecond)        # => 2000-12-31 23:59:59 -0600
    Time.at(secs, 500000, :microsecond)   # => 2000-12-31 23:59:59.5 -0600
    Time.at(secs, 1000000, :microsecond)  # => 2001-01-01 00:00:00 -0600
    Time.at(secs, -1000000, :microsecond) # => 2000-12-31 23:59:58 -0600
    
  • :奈秒:奈秒子秒 以奈秒為單位

    Time.at(secs, 0, :nanosecond)           # => 2000-12-31 23:59:59 -0600
    Time.at(secs, 500000000, :nanosecond)   # => 2000-12-31 23:59:59.5 -0600
    Time.at(secs, 1000000000, :nanosecond)  # => 2001-01-01 00:00:00 -0600
    Time.at(secs, -1000000000, :nanosecond) # => 2000-12-31 23:59:58 -0600
    

選擇性的關鍵字引數 in: 區域 指定回傳時間的時區

Time.at(secs, in: '+12:00') # => 2001-01-01 17:59:59 +1200
Time.at(secs, in: '-12:00') # => 2000-12-31 17:59:59 -1200

有關參數 zone 的形式,請參閱 時區規格

# File timev.rb, line 284
def self.at(time, subsec = false, unit = :microsecond, in: nil)
  if Primitive.mandatory_only?
    Primitive.time_s_at1(time)
  else
    Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
  end
end
gm
別名:utc
httpdate(日期) 按一下以切換來源

日期 解析為 RFC 2616 定義的 HTTP 日期,並將其轉換為 時間 物件。

ArgumentError 會在 date 不符合 RFC 2616 或 Time 類別無法表示指定日期時引發。

有關此格式的更多資訊,請參閱 httpdate

require 'time'

Time.httpdate("Thu, 06 Oct 2011 02:26:12 GMT")
#=> 2011-10-06 02:26:12 UTC

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 566
def httpdate(date)
  if date.match?(/\A\s*
      (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
      (\d{2})\x20
      (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
      (\d{4})\x20
      (\d{2}):(\d{2}):(\d{2})\x20
      GMT
      \s*\z/ix)
    self.rfc2822(date).utc
  elsif /\A\s*
         (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20
         (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20
         (\d\d):(\d\d):(\d\d)\x20
         GMT
         \s*\z/ix =~ date
    year = $3.to_i
    if year < 50
      year += 2000
    else
      year += 1900
    end
    self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i)
  elsif /\A\s*
         (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
         (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
         (\d\d|\x20\d)\x20
         (\d\d):(\d\d):(\d\d)\x20
         (\d{4})
         \s*\z/ix =~ date
    self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
             $3.to_i, $4.to_i, $5.to_i)
  else
    raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
  end
end
iso8601(時間)
別名為:xmlschema
json_create(物件) 按一下以切換來源

請參閱 as_json

# File ext/json/lib/json/add/time.rb, line 9
def self.json_create(object)
  if usec = object.delete('u') # used to be tv_usec -> tv_nsec
    object['n'] = usec * 1000
  end
  if method_defined?(:tv_nsec)
    at(object['s'], Rational(object['n'], 1000))
  else
    at(object['s'], object['n'] / 1000)
  end
end
local(年, 月 = 1, 日 = 1, 時 = 0, 分 = 0, 秒 = 0, 微秒 = 0) → 新時間 按一下以切換來源
local(秒, 分, 時, 日, 月, 年, 虛擬, 虛擬, 虛擬, 虛擬) → 新時間

Time.utc 類似,但傳回的 Time 物件具有當地時區,而非 UTC 時區

# With seven arguments.
Time.local(0, 1, 2, 3, 4, 5, 6)
# => 0000-01-02 03:04:05.000006 -0600
# With exactly ten arguments.
Time.local(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# => 0005-04-03 02:01:00 -0600
static VALUE
time_s_mktime(int argc, VALUE *argv, VALUE klass)
{
    struct vtm vtm;

    time_arg(argc, argv, &vtm);
    return time_localtime(time_new_timew(klass, timelocalw(&vtm)));
}
別名也為:mktime
mktime
別名為:local
new(年 = nil, 月 = nil, 日 = nil, 時 = nil, 分 = nil, 秒 = nil, 區 = nil, in: nil, 精度: 9) 按一下以切換來源

傳回一個新的 Time 物件,根據指定的引數,預設為當地時區。

如果沒有位置引數,傳回 Time.now 的值

Time.new # => 2021-04-24 17:27:46.0512465 -0500

如果有一個字串引數表示時間,傳回一個新的 Time 物件,根據指定的引數,在當地時區。

Time.new('2000-12-31 23:59:59.5')              # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.5 +0900')        # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5', in: '+0900') # => 2000-12-31 23:59:59.5 +0900
Time.new('2000-12-31 23:59:59.5')              # => 2000-12-31 23:59:59.5 -0600
Time.new('2000-12-31 23:59:59.56789', precision: 3) # => 2000-12-31 23:59:59.567 -0600

如果有一到六個引數,傳回一個新的 Time 物件,根據指定的引數,在當地時區。

Time.new(2000, 1, 2, 3, 4, 5) # => 2000-01-02 03:04:05 -0600

對於位置引數(除了

  • :年,沒有範圍限制

    Time.new(999999999)  # => 999999999-01-01 00:00:00 -0600
    Time.new(-999999999) # => -999999999-01-01 00:00:00 -0600
    
  • :範圍內月份 (1..12),或不分大小寫的 3 個字母的月份名稱

    Time.new(2000, 1)     # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 12)    # => 2000-12-01 00:00:00 -0600
    Time.new(2000, 'jan') # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 'JAN') # => 2000-01-01 00:00:00 -0600
    
  • :範圍內月份日期 (1..31)

    Time.new(2000, 1, 1)  # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 1, 31) # => 2000-01-31 00:00:00 -0600
    
  • :範圍內小時 (0..23),或 24(如果 微秒為零)

    Time.new(2000, 1, 1, 0)  # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 1, 1, 23) # => 2000-01-01 23:00:00 -0600
    Time.new(2000, 1, 1, 24) # => 2000-01-02 00:00:00 -0600
    
  • :範圍內分鐘 (0..59)

    Time.new(2000, 1, 1, 0, 0)  # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 -0600
    
  • :範圍內秒數 (0…61)

    Time.new(2000, 1, 1, 0, 0, 0)  # => 2000-01-01 00:00:00 -0600
    Time.new(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 -0600
    Time.new(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 -0600
    

    可以是 FloatRational

    Time.new(2000, 1, 1, 0, 0, 59.5)  # => 2000-12-31 23:59:59.5 +0900
    Time.new(2000, 1, 1, 0, 0, 59.7r) # => 2000-12-31 23:59:59.7 +0900
    

這些值可以是

  • 整數,如上。

  • 可轉換為整數的數字

    Time.new(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0)
    # => 0000-01-01 00:00:00 -0600
    
  • String 整數

    a = %w[0 1 1 0 0 0]
    # => ["0", "1", "1", "0", "0", "0"]
    Time.new(*a) # => 0000-01-01 00:00:00 -0600
    

當位置引數 或關鍵字引數 in: 提供時,新的 Time 物件會在指定的時區。有關引數 的形式,請參閱 時區指定

Time.new(2000, 1, 1, 0, 0, 0, '+12:00')
# => 2000-01-01 00:00:00 +1200
Time.new(2000, 1, 1, 0, 0, 0, in: '-12:00')
# => 2000-01-01 00:00:00 -1200
Time.new(in: '-12:00')
# => 2022-08-23 08:49:26.1941467 -1200

由於 in: 關鍵字引數只提供預設值,因此如果單一字串形式的第一個引數包含時區資訊,此關鍵字引數將會被自動忽略。

Time.new('2000-01-01 00:00:00 +0100', in: '-0500').utc_offset  # => 3600
  • 精度:子秒部分中有效數字的最大值,預設為 9。其他 Time 作業時,其他數字將會被截斷。除非第一個引數為字串,否則會被忽略。

# File timev.rb, line 395
def initialize(year = (now = true), mon = (str = year; nil), mday = nil, hour = nil, min = nil, sec = nil, zone = nil,
               in: nil, precision: 9)
  if zone
    if Primitive.arg!(:in)
      raise ArgumentError, "timezone argument given as positional and keyword arguments"
    end
  else
    zone = Primitive.arg!(:in)
  end

  if now
    return Primitive.time_init_now(zone)
  end

  if str and Primitive.time_init_parse(str, zone, precision)
    return self
  end

  Primitive.time_init_args(year, mon, mday, hour, min, sec, zone)
end
現在(輸入:無) 按一下以切換來源

根據目前的系統時間建立新的 時間 物件。這與沒有參數的 時間.new 相同。

Time.now               # => 2009-06-24 12:39:54 +0900
Time.now(in: '+04:00') # => 2009-06-24 07:39:54 +0400

有關參數 時區 的格式,請參閱 時區規格

# File timev.rb, line 225
def self.now(in: nil)
  Primitive.time_s_now(Primitive.arg!(:in))
end
分析(日期,現在=self.now) { |年| ... } 按一下以切換來源

取得 時間 的字串表示形式,並嘗試使用啟發法來分析它。

此方法 **不會** 作為驗證器。如果輸入字串不完全符合有效格式,您可能會得到難以理解的結果。應考慮使用「時間.strptime`」取代此方法。

require 'time'

Time.parse("2010-10-31") #=> 2010-10-31 00:00:00 -0500

任何遺失的日期部分會根據目前日期進行推論。

require 'time'

# assuming the current date is "2011-10-31"
Time.parse("12:00") #=> 2011-10-31 12:00:00 -0500

我們可以透過傳遞第二個物件來變更用於推論遺失元素的日期,該物件會回應 mondayyear,例如 日期時間日期時間。我們也可以使用自己的物件。

require 'time'

class MyDate
  attr_reader :mon, :day, :year

  def initialize(mon, day, year)
    @mon, @day, @year = mon, day, year
  end
end

d  = Date.parse("2010-10-28")
t  = Time.parse("2010-10-29")
dt = DateTime.parse("2010-10-30")
md = MyDate.new(10,31,2010)

Time.parse("12:00", d)  #=> 2010-10-28 12:00:00 -0500
Time.parse("12:00", t)  #=> 2010-10-29 12:00:00 -0500
Time.parse("12:00", dt) #=> 2010-10-30 12:00:00 -0500
Time.parse("12:00", md) #=> 2010-10-31 12:00:00 -0500

如果給定區塊,日期 中描述的年份會由區塊轉換。這特別用於處理兩位數年份。例如,如果您想要將 70 年以前的兩位數年份視為 2000 年後,您可以撰寫以下內容

require 'time'

Time.parse("01-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
#=> 2001-10-31 00:00:00 -0500
Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
#=> 1970-10-31 00:00:00 -0500

如果給定時間的上層元件損毀或遺失,它們會提供 現在 的元件。對於下層元件,如果損毀或遺失,會假設最小值 (1 或 0)。例如

require 'time'

# Suppose it is "Thu Nov 29 14:33:20 2001" now and
# your time zone is EST which is GMT-5.
now = Time.parse("Thu Nov 29 14:33:20 2001")
Time.parse("16:30", now)     #=> 2001-11-29 16:30:00 -0500
Time.parse("7/23", now)      #=> 2001-07-23 00:00:00 -0500
Time.parse("Aug 31", now)    #=> 2001-08-31 00:00:00 -0500
Time.parse("Aug 2000", now)  #=> 2000-08-01 00:00:00 -0500

由於世界各地有許多定義不明的時區縮寫,因此此方法並非旨在了解所有時區縮寫。例如,「CST」縮寫有各種不同的用途,例如

-06:00 in America/Chicago,
-05:00 in America/Havana,
+08:00 in Asia/Harbin,
+09:30 in Australia/Darwin,
+10:30 in Australia/Adelaide,
etc.

基於此事實,此方法只會了解 RFC 822 和系統時區中描述的時區縮寫,順序如上所述。(亦即,RFC 822 中的定義會覆寫系統時區定義。) 系統時區取自 時間.當地(年,1,1).時區時間.當地(年,7,1).時區。如果提取的時區縮寫與其中任何一個都不相符,它會被忽略,而給定的時間會被視為當地時間。

如果 日期._parse 無法從 日期 中提取資訊,或是 時間 類別無法表示指定的日期,則會引發 引數錯誤

此方法可以用作其他分析方法的故障安全,例如

Time.rfc2822(date) rescue Time.parse(date)
Time.httpdate(date) rescue Time.parse(date)
Time.xmlschema(date) rescue Time.parse(date)

不過,應檢查 時間.分析 是否失敗。

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 381
def parse(date, now=self.now)
  comp = !block_given?
  d = Date._parse(date, comp)
  year = d[:year]
  year = yield(year) if year && !comp
  make_time(date, year, d[:yday], d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
end
rfc2822(日期) 按一下以切換來源

日期 分析為 RFC 2822 定義的日期時間,並將其轉換為 時間 物件。格式與 RFC 822 定義的日期格式相同,並由 RFC 1123 更新。

如果 日期 不符合 RFC 2822,或是 時間 類別無法表示指定的日期,則會引發 引數錯誤

有關此格式的更多資訊,請參閱 rfc2822

require 'time'

Time.rfc2822("Wed, 05 Oct 2011 22:26:12 -0400")
#=> 2010-10-05 22:26:12 -0400

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 508
def rfc2822(date)
  if /\A\s*
      (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
      (\d{1,2})\s+
      (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
      (\d{2,})\s+
      (\d{2})\s*
      :\s*(\d{2})
      (?:\s*:\s*(\d\d))?\s+
      ([+-]\d{4}|
       UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
    # Since RFC 2822 permit comments, the regexp has no right anchor.
    day = $1.to_i
    mon = MonthValue[$2.upcase]
    year = $3.to_i
    short_year_p = $3.length <= 3
    hour = $4.to_i
    min = $5.to_i
    sec = $6 ? $6.to_i : 0
    zone = $7

    if short_year_p
      # following year completion is compliant with RFC 2822.
      year = if year < 50
               2000 + year
             else
               1900 + year
             end
    end

    off = zone_offset(zone)
    year, mon, day, hour, min, sec =
      apply_offset(year, mon, day, hour, min, sec, off)
    t = self.utc(year, mon, day, hour, min, sec)
    force_zone!(t, zone, off)
    t
  else
    raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
  end
end
別名為:rfc822
rfc822(date)
別名為:rfc2822
strptime(date, format, now=self.now) { |year| ... } 按一下以切換原始碼

運作方式類似於 parse,但您提供第二個參數描述字串格式,而不是使用啟發法來偵測輸入字串的格式。

如果給定區塊,date 中所述的年份將由區塊轉換。例如

Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}

以下是格式化選項的清單

%a

縮寫的星期名稱(「日」)

%A

完整的星期名稱(「星期日」)

%b

縮寫的月份名稱(「1 月」)

%B

完整的月份名稱(「一月」)

%c

偏好的當地日期和時間表示法

%C

世紀(2009 年為 20)

%d

該月份中的日期(01..31)

%D

Date(%m/%d/%y)

%e

該月份中的日期,空白補齊(1..31)

%F

等於 %Y-%m-%d(ISO 8601 日期格式)

%g

商業年份的最後兩個數字

%G

根據 ISO-8601 的週為基礎年份(第 1 週從星期一開始,並包含 1 月 4 日)

%h

等於 %b

%H

24 小時制中的小時(00..23)

%I

12 小時制中的小時(01..12)

%j

該年份中的日期(001..366)

%k

24 小時制中的小時,空白補齊(0..23)

%l

12 小時制中的小時,空白補齊(0..12)

%L

秒的毫秒(000..999)

%m

該年份中的月份(01..12)

%M

該小時中的分鐘(00..59)

%n

換行符號 (n)

%N

小數秒數位

%p

午夜指標(「AM」或「PM」)

%P

午夜指標(「am」或「pm」)

%r

12 小時時間(與 %I:%M:%S %p 相同)

%R

24 小時制時間 (%H:%M)

%s

自 1970-01-01 00:00:00 UTC 以來的秒數。

%S

分鐘的秒數 (00..60)

%t

跳格字元 (t)

%T

24 小時制時間 (%H:%M:%S)

%u

星期幾,星期一為 1,以十進位表示。(1..7)

%U

當年的星期數,以第一個星期日為第一個星期的第一天 (00..53)

%v

VMS 日期 (%e-%b-%Y)

%V

依據 ISO 8601 的星期數 (01..53)

%W

當年的星期數,以第一個星期一為第一個星期的第一天 (00..53)

%w

星期幾 (星期日為 0,0..6)

%x

僅日期的建議表示法,不含時間

%X

僅時間的建議表示法,不含日期

%y

不含世紀的年份 (00..99)

%Y

可能包含世紀的年份,如果提供的話

%z

時間時區為與 UTC 的小時偏移量 (例如 +0900)

%Z

時間時區名稱

%%

字面上的「%」字元

%+

date(1) (%a %b %e %H:%M:%S %Z %Y)

require 'time'

Time.strptime("2000-10-31", "%Y-%m-%d") #=> 2000-10-31 00:00:00 -0500

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 456
def strptime(date, format, now=self.now)
  d = Date._strptime(date, format)
  raise ArgumentError, "invalid date or strptime format - `#{date}' `#{format}'" unless d
  if seconds = d[:seconds]
    if sec_fraction = d[:sec_fraction]
      usec = sec_fraction * 1000000
      usec *= -1 if seconds < 0
    else
      usec = 0
    end
    t = Time.at(seconds, usec)
    if zone = d[:zone]
      force_zone!(t, zone)
    end
  else
    year = d[:year]
    year = yield(year) if year && block_given?
    yday = d[:yday]
    if (d[:cwyear] && !year) || ((d[:cwday] || d[:cweek]) && !(d[:mon] && d[:mday]))
      # make_time doesn't deal with cwyear/cwday/cweek
      return Date.strptime(date, format).to_time
    end
    if (d[:wnum0] || d[:wnum1]) && !yday && !(d[:mon] && d[:mday])
      yday = Date.strptime(date, format).yday
    end
    t = make_time(date, year, yday, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
  end
  t
end
utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0) → new_time 按一下以切換來源
utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy) → new_time

傳回一個新的 時間 物件,根據給定的引數,在 UTC 時區。

給定一個到七個引數,引數會根據上面第一個呼叫順序來詮釋

Time.utc(year, month = 1, mday = 1, hour = 0, min = 0, sec = 0, usec = 0)

範例

Time.utc(2000)  # => 2000-01-01 00:00:00 UTC
Time.utc(-2000) # => -2000-01-01 00:00:00 UTC

必要的引數 year 沒有最小和最大值。

對於選用的引數

  • :範圍內月份 (1..12),或不分大小寫的 3 個字母的月份名稱

    Time.utc(2000, 1)     # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 12)    # => 2000-12-01 00:00:00 UTC
    Time.utc(2000, 'jan') # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 'JAN') # => 2000-01-01 00:00:00 UTC
    
  • :範圍內月份日期 (1..31)

    Time.utc(2000, 1, 1)  # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 1, 31) # => 2000-01-31 00:00:00 UTC
    
  • :範圍內小時 (0..23),或 24(如果 微秒為零)

    Time.utc(2000, 1, 1, 0)  # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 1, 1, 23) # => 2000-01-01 23:00:00 UTC
    Time.utc(2000, 1, 1, 24) # => 2000-01-02 00:00:00 UTC
    
  • :範圍內分鐘 (0..59)

    Time.utc(2000, 1, 1, 0, 0)  # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 1, 1, 0, 59) # => 2000-01-01 00:59:00 UTC
    
  • sec:範圍 (0..59) 內的秒數,或如果 usec 為零,則為 60

    Time.utc(2000, 1, 1, 0, 0, 0)  # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 1, 1, 0, 0, 59) # => 2000-01-01 00:00:59 UTC
    Time.utc(2000, 1, 1, 0, 0, 60) # => 2000-01-01 00:01:00 UTC
    
  • usec:範圍 (0..999999) 內的微秒

    Time.utc(2000, 1, 1, 0, 0, 0, 0)      # => 2000-01-01 00:00:00 UTC
    Time.utc(2000, 1, 1, 0, 0, 0, 999999) # => 2000-01-01 00:00:00.999999 UTC
    

值可能是

  • 整數,如上。

  • 可轉換為整數的數字

    Time.utc(Float(0.0), Rational(1, 1), 1.0, 0.0, 0.0, 0.0, 0.0)
    # => 0000-01-01 00:00:00 UTC
    
  • String 整數

    a = %w[0 1 1 0 0 0 0 0]
    # => ["0", "1", "1", "0", "0", "0", "0", "0"]
    Time.utc(*a) # => 0000-01-01 00:00:00 UTC
    

當給定剛好十個引數時,引數會根據上面第二個呼叫順序來詮釋

Time.utc(sec, min, hour, mday, month, year, dummy, dummy, dummy, dummy)

其中 dummy 引數會被忽略

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Time.utc(*a) # => 0005-04-03 02:01:00 UTC

此表單對於從 時間.to_a 傳回的 10 個元素陣列建立一個 時間 物件很有用

t = Time.new(2000, 1, 2, 3, 4, 5, 6) # => 2000-01-02 03:04:05 +000006
a = t.to_a   # => [5, 4, 3, 2, 1, 2000, 0, 2, false, nil]
Time.utc(*a) # => 2000-01-02 03:04:05 UTC

這兩個表單的前六個引數是相同的,儘管順序不同;這些共同引數的範圍對於這兩個表單來說都是相同的;請參閱上面。

如果參數數量為八個、九個或大於十個,則會引發例外狀況。

相關:Time.local

static VALUE
time_s_mkutc(int argc, VALUE *argv, VALUE klass)
{
    struct vtm vtm;

    time_arg(argc, argv, &vtm);
    return time_gmtime(time_new_timew(klass, timegmw(&vtm)));
}
別名:gm
xmlschema(time) 按一下以切換來源

time 解析為 XML Schema 定義的日期時間,並轉換為 Time 物件。格式為 ISO 8601 定義格式的受限版本。

如果 time 不符合格式,或如果 Time 類別無法表示指定的時間,則會引發 ArgumentError

請參閱 xmlschema 以取得有關此格式的更多資訊。

require 'time'

Time.xmlschema("2011-10-05T22:26:12-04:00")
#=> 2011-10-05 22:26:12-04:00

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 620
def xmlschema(time)
  if /\A\s*
      (-?\d+)-(\d\d)-(\d\d)
      T
      (\d\d):(\d\d):(\d\d)
      (\.\d+)?
      (Z|[+-]\d\d(?::?\d\d)?)?
      \s*\z/ix =~ time
    year = $1.to_i
    mon = $2.to_i
    day = $3.to_i
    hour = $4.to_i
    min = $5.to_i
    sec = $6.to_i
    usec = 0
    if $7
      usec = Rational($7) * 1000000
    end
    if $8
      zone = $8
      off = zone_offset(zone)
      year, mon, day, hour, min, sec =
        apply_offset(year, mon, day, hour, min, sec, off)
      t = self.utc(year, mon, day, hour, min, sec, usec)
      force_zone!(t, zone, off)
      t
    else
      self.local(year, mon, day, hour, min, sec, usec)
    end
  else
    raise ArgumentError.new("invalid xmlschema format: #{time.inspect}")
  end
end
別名:iso8601
zone_offset(zone, year=self.now.year) 按一下以切換來源

傳回指定時區與 UTC 的秒數差異。

包含分鐘的 Numeric 時區,例如 -10:00+1330,以及僅包含小時的時區,例如 -10+13,都可使用。

ZoneOffset 中列出的文字時區也受支援。

如果時區與上述任何一個都不相符,zone_offset 會檢查當地時區(無論是否套用夏令時間變更)是否與 zone 相符。指定 year 的值會變更用於尋找當地時區的年份。

如果 zone_offset 無法判定偏移量,則會傳回 nil。

require 'time'

Time.zone_offset("EST") #=> -18000

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 82
def zone_offset(zone, year=self.now.year)
  off = nil
  zone = zone.upcase
  if /\A([+-])(\d\d)(:?)(\d\d)(?:\3(\d\d))?\z/ =~ zone
    off = ($1 == '-' ? -1 : 1) * (($2.to_i * 60 + $4.to_i) * 60 + $5.to_i)
  elsif zone.match?(/\A[+-]\d\d\z/)
    off = zone.to_i * 3600
  elsif ZoneOffset.include?(zone)
    off = ZoneOffset[zone] * 3600
  elsif ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false)
    off = t.utc_offset
  elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false)
    off = t.utc_offset
  end
  off
end

公開實例方法

self + numeric → new_time 按一下以切換來源

傳回新的 Time 物件,其值為 self 的數值與給定 numeric 的總和

t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t + (60 * 60 * 24) # => 2000-01-02 00:00:00 -0600
t + 0.5            # => 2000-01-01 00:00:00.5 -0600

相關:Time#-

static VALUE
time_plus(VALUE time1, VALUE time2)
{
    struct time_object *tobj;
    GetTimeval(time1, tobj);

    if (IsTimeval(time2)) {
        rb_raise(rb_eTypeError, "time + time?");
    }
    return time_add(tobj, time1, time2, 1);
}
self - numeric → new_time 按一下以切換來源
self - other_time → float

當給定 numeric 時,傳回新的 Time 物件,其值為 selfnumeric 的數值差異

t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t - (60 * 60 * 24) # => 1999-12-31 00:00:00 -0600
t - 0.5            # => 1999-12-31 23:59:59.5 -0600

當給定 other_time 時,傳回 Float,其值為 selfother_time 的數值差異(以秒為單位)

t - t # => 0.0

相關:Time#+

static VALUE
time_minus(VALUE time1, VALUE time2)
{
    struct time_object *tobj;

    GetTimeval(time1, tobj);
    if (IsTimeval(time2)) {
        struct time_object *tobj2;

        GetTimeval(time2, tobj2);
        return rb_Float(rb_time_unmagnify_to_float(wsub(tobj->timew, tobj2->timew)));
    }
    return time_add(tobj, time1, time2, -1);
}
self <=> other_time → -1, 0, +1, or nil 按一下以切換來源

比較 selfother_time;傳回

  • -1,如果 self 小於 other_time

  • 0,如果 self 等於 other_time

  • 1,如果 self 大於 other_time

  • nil,如果 selfother_time 無法比較。

範例

t = Time.now     # => 2007-11-19 08:12:12 -0600
t2 = t + 2592000 # => 2007-12-19 08:12:12 -0600
t <=> t2         # => -1
t2 <=> t         # => 1

t = Time.now     # => 2007-11-19 08:13:38 -0600
t2 = t + 0.1     # => 2007-11-19 08:13:38 -0600
t.nsec           # => 98222999
t2.nsec          # => 198222999
t <=> t2         # => -1
t2 <=> t         # => 1
t <=> t          # => 0
static VALUE
time_cmp(VALUE time1, VALUE time2)
{
    struct time_object *tobj1, *tobj2;
    int n;

    GetTimeval(time1, tobj1);
    if (IsTimeval(time2)) {
        GetTimeval(time2, tobj2);
        n = wcmp(tobj1->timew, tobj2->timew);
    }
    else {
        return rb_invcmp(time1, time2);
    }
    if (n == 0) return INT2FIX(0);
    if (n > 0) return INT2FIX(1);
    return INT2FIX(-1);
}
as_json(*) 按一下以切換來源

方法 Time#as_jsonTime.json_create 可用於序列化和反序列化 Time 物件;請參閱 Marshal

方法 Time#as_json 會序列化 self,傳回表示 self 的 2 元素雜湊

require 'json/add/time'
x = Time.now.as_json
# => {"json_class"=>"Time", "s"=>1700931656, "n"=>472846644}

方法 JSON.create 會反序列化此類雜湊,傳回 Time 物件

Time.json_create(x)
# => 2023-11-25 11:00:56.472846644 -0600
# File ext/json/lib/json/add/time.rb, line 36
def as_json(*)
  nanoseconds = [ tv_usec * 1000 ]
  respond_to?(:tv_nsec) and nanoseconds << tv_nsec
  nanoseconds = nanoseconds.max
  {
    JSON.create_id => self.class.name,
    's'            => tv_sec,
    'n'            => nanoseconds,
  }
end
asctime
別名:ctime
ceil(ndigits = 0) → new_time 按一下以切換來源

傳回新的 Time 物件,其數值大於或等於 self,且其秒數已截斷至精度 ndigits

t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t          # => 2010-03-30 05:43:25.123456789 UTC
t.ceil     # => 2010-03-30 05:43:26 UTC
t.ceil(2)  # => 2010-03-30 05:43:25.13 UTC
t.ceil(4)  # => 2010-03-30 05:43:25.1235 UTC
t.ceil(6)  # => 2010-03-30 05:43:25.123457 UTC
t.ceil(8)  # => 2010-03-30 05:43:25.12345679 UTC
t.ceil(10) # => 2010-03-30 05:43:25.123456789 UTC

t = Time.utc(1999, 12, 31, 23, 59, 59)
t              # => 1999-12-31 23:59:59 UTC
(t + 0.4).ceil # => 2000-01-01 00:00:00 UTC
(t + 0.9).ceil # => 2000-01-01 00:00:00 UTC
(t + 1.4).ceil # => 2000-01-01 00:00:01 UTC
(t + 1.9).ceil # => 2000-01-01 00:00:01 UTC

相關:Time#floorTime#round

static VALUE
time_ceil(int argc, VALUE *argv, VALUE time)
{
    VALUE ndigits, v, den;
    struct time_object *tobj;

    if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
        den = INT2FIX(1);
    else
        den = ndigits_denominator(ndigits);

    GetTimeval(time, tobj);
    v = w2v(rb_time_unmagnify(tobj->timew));

    v = modv(v, den);
    if (!rb_equal(v, INT2FIX(0))) {
        v = subv(den, v);
    }
    return time_add(tobj, time, v, 1);
}
ctime → string 按一下以切換來源

傳回 self 的字串表示形式,格式由 strftime('%a %b %e %T %Y') 或其簡寫版本 strftime('%c') 設定;請參閱 日期和時間格式

t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.ctime                      # => "Sun Dec 31 23:59:59 2000"
t.strftime('%a %b %e %T %Y') # => "Sun Dec 31 23:59:59 2000"
t.strftime('%c')             # => "Sun Dec 31 23:59:59 2000"

相關:Time#to_sTime#inspect

t.inspect                    # => "2000-12-31 23:59:59.5 +000001"
t.to_s                       # => "2000-12-31 23:59:59 +0000"
static VALUE
time_asctime(VALUE time)
{
    return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding());
}
別名:asctime
day
別名:mday
deconstruct_keys(array_of_names_or_nil) → hash 按一下以切換來源

傳回名稱/值配對的雜湊,用於模式比對。可能的鍵::year:month:day:yday:wday:hour:min:sec:subsec:dst:zone

可能的用法

t = Time.utc(2022, 10, 5, 21, 25, 30)

if t in wday: 3, day: ..7  # uses deconstruct_keys underneath
  puts "first Wednesday of the month"
end
#=> prints "first Wednesday of the month"

case t
in year: ...2022
  puts "too old"
in month: ..9
  puts "quarter 1-3"
in wday: 1..5, month:
  puts "working day in month #{month}"
end
#=> prints "working day in month 10"

請注意,也可以將模式解構與類別檢查結合使用

if t in Time(wday: 3, day: ..7)
  puts "first Wednesday of the month"
end
static VALUE
time_deconstruct_keys(VALUE time, VALUE keys)
{
    struct time_object *tobj;
    VALUE h;
    long i;

    GetTimeval(time, tobj);
    MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);

    if (NIL_P(keys)) {
        h = rb_hash_new_with_size(11);

        rb_hash_aset(h, sym_year, tobj->vtm.year);
        rb_hash_aset(h, sym_month, INT2FIX(tobj->vtm.mon));
        rb_hash_aset(h, sym_day, INT2FIX(tobj->vtm.mday));
        rb_hash_aset(h, sym_yday, INT2FIX(tobj->vtm.yday));
        rb_hash_aset(h, sym_wday, INT2FIX(tobj->vtm.wday));
        rb_hash_aset(h, sym_hour, INT2FIX(tobj->vtm.hour));
        rb_hash_aset(h, sym_min, INT2FIX(tobj->vtm.min));
        rb_hash_aset(h, sym_sec, INT2FIX(tobj->vtm.sec));
        rb_hash_aset(h, sym_subsec,
                     quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)));
        rb_hash_aset(h, sym_dst, RBOOL(tobj->vtm.isdst));
        rb_hash_aset(h, sym_zone, time_zone(time));

        return h;
    }
    if (UNLIKELY(!RB_TYPE_P(keys, T_ARRAY))) {
        rb_raise(rb_eTypeError,
                 "wrong argument type %"PRIsVALUE" (expected Array or nil)",
                 rb_obj_class(keys));

    }

    h = rb_hash_new_with_size(RARRAY_LEN(keys));

    for (i=0; i<RARRAY_LEN(keys); i++) {
        VALUE key = RARRAY_AREF(keys, i);

        if (sym_year == key) rb_hash_aset(h, key, tobj->vtm.year);
        if (sym_month == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.mon));
        if (sym_day == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.mday));
        if (sym_yday == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.yday));
        if (sym_wday == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.wday));
        if (sym_hour == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.hour));
        if (sym_min == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.min));
        if (sym_sec == key) rb_hash_aset(h, key, INT2FIX(tobj->vtm.sec));
        if (sym_subsec == key) {
            rb_hash_aset(h, key, quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)));
        }
        if (sym_dst == key) rb_hash_aset(h, key, RBOOL(tobj->vtm.isdst));
        if (sym_zone == key) rb_hash_aset(h, key, time_zone(time));
    }
    return h;
}
dst? → true 或 false

如果 self 處於夏令時間,則傳回 true,否則傳回 false

t = Time.local(2000, 1, 1) # => 2000-01-01 00:00:00 -0600
t.zone                     # => "Central Standard Time"
t.dst?                     # => false
t = Time.local(2000, 7, 1) # => 2000-07-01 00:00:00 -0500
t.zone                     # => "Central Daylight Time"
t.dst?                     # => true
別名:isdst
eql?(other_time) 按一下以切換來源

如果 selfother_time 都是時間值完全相同的 Time 物件,則傳回 true

static VALUE
time_eql(VALUE time1, VALUE time2)
{
    struct time_object *tobj1, *tobj2;

    GetTimeval(time1, tobj1);
    if (IsTimeval(time2)) {
        GetTimeval(time2, tobj2);
        return rb_equal(w2v(tobj1->timew), w2v(tobj2->timew));
    }
    return Qfalse;
}
floor(ndigits = 0) → new_time 按一下以切換來源

傳回新的 Time 物件,其數值小於或等於 self,且其秒數已截斷至精度 ndigits

t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t           # => 2010-03-30 05:43:25.123456789 UTC
t.floor     # => 2010-03-30 05:43:25 UTC
t.floor(2)  # => 2010-03-30 05:43:25.12 UTC
t.floor(4)  # => 2010-03-30 05:43:25.1234 UTC
t.floor(6)  # => 2010-03-30 05:43:25.123456 UTC
t.floor(8)  # => 2010-03-30 05:43:25.12345678 UTC
t.floor(10) # => 2010-03-30 05:43:25.123456789 UTC

t = Time.utc(1999, 12, 31, 23, 59, 59)
t               # => 1999-12-31 23:59:59 UTC
(t + 0.4).floor # => 1999-12-31 23:59:59 UTC
(t + 0.9).floor # => 1999-12-31 23:59:59 UTC
(t + 1.4).floor # => 2000-01-01 00:00:00 UTC
(t + 1.9).floor # => 2000-01-01 00:00:00 UTC

相關:Time#ceilTime#round

static VALUE
time_floor(int argc, VALUE *argv, VALUE time)
{
    VALUE ndigits, v, den;
    struct time_object *tobj;

    if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
        den = INT2FIX(1);
    else
        den = ndigits_denominator(ndigits);

    GetTimeval(time, tobj);
    v = w2v(rb_time_unmagnify(tobj->timew));

    v = modv(v, den);
    return time_add(tobj, time, v, -1);
}
friday? → true 或 false 按一下以切換來源

如果 self 表示星期五,則傳回 true,否則傳回 false

t = Time.utc(2000, 1, 7) # => 2000-01-07 00:00:00 UTC
t.friday?                # => true

相關:Time#saturday?Time#sunday?Time#monday?

static VALUE
time_friday(VALUE time)
{
    wday_p(5);
}
getgm
別名為:getutc
getlocal(zone = nil) → new_time 按一下以切換來源

傳回一個新的 Time 物件,表示 self 的值轉換成指定的時區;如果 zonenil,則使用本機時區

t = Time.utc(2000)                    # => 2000-01-01 00:00:00 UTC
t.getlocal                            # => 1999-12-31 18:00:00 -0600
t.getlocal('+12:00')                  # => 2000-01-01 12:00:00 +1200

有關參數 時區 的格式,請參閱 時區規格

static VALUE
time_getlocaltime(int argc, VALUE *argv, VALUE time)
{
    VALUE off;

    if (rb_check_arity(argc, 0, 1) && !NIL_P(off = argv[0])) {
        VALUE zone = off;
        if (maybe_tzobj_p(zone)) {
            VALUE t = time_dup(time);
            if (zone_localtime(off, t)) return t;
        }

        if (NIL_P(off = utc_offset_arg(off))) {
            off = zone;
            if (NIL_P(zone = find_timezone(time, off))) invalid_utc_offset(off);
            time = time_dup(time);
            if (!zone_localtime(zone, time)) invalid_utc_offset(off);
            return time;
        }
        else if (off == UTC_ZONE) {
            return time_gmtime(time_dup(time));
        }
        validate_utc_offset(off);

        time = time_dup(time);
        time_set_utc_offset(time, off);
        return time_fixoff(time);
    }

    return time_localtime(time_dup(time));
}
getutc → new_time

傳回一個新的 Time 物件,表示 self 的值轉換成 UTC 時區

local = Time.local(2000) # => 2000-01-01 00:00:00 -0600
local.utc?               # => false
utc = local.getutc       # => 2000-01-01 06:00:00 UTC
utc.utc?                 # => true
utc == local             # => true
別名為:getgm
gmt?
別名為:utc?
gmt_offset
別名為:gmtoff
gmtime
別名為:utc
gmtoff
別名為:gmt_offsetutc_offset
hash → integer 按一下以切換來源

傳回 self 的整數雜湊碼。

相關:Object#hash

static VALUE
time_hash(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return rb_hash(w2v(tobj->timew));
}
hour → integer 按一下以切換來源

傳回 self 的一天中的整數小時,範圍為 (0..23)

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.hour # => 3

相關:Time#yearTime#monTime#min

static VALUE
time_hour(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return INT2FIX(tobj->vtm.hour);
}
httpdate() 按一下以切換來源

傳回一個字串,表示 RFC 2616 定義的 HTTP 日期 RFC 1123 日期格式的時間

day-of-week, DD month-name CCYY hh:mm:ss GMT

請注意,結果永遠是 UTC (GMT)。

require 'time'

t = Time.now
t.httpdate # => "Thu, 06 Oct 2011 02:26:12 GMT"

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 692
def httpdate
  getutc.strftime('%a, %d %b %Y %T GMT')
end
inspect → string 按一下以切換來源

傳回 self 的字串表示形式,包含次秒

t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.inspect # => "2000-12-31 23:59:59.5 +000001"

相關:Time#ctimeTime#to_s

t.ctime   # => "Sun Dec 31 23:59:59 2000"
t.to_s    # => "2000-12-31 23:59:59 +0000"
static VALUE
time_inspect(VALUE time)
{
    struct time_object *tobj;
    VALUE str, subsec;

    GetTimeval(time, tobj);
    str = strftimev("%Y-%m-%d %H:%M:%S", time, rb_usascii_encoding());
    subsec = w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE)));
    if (subsec == INT2FIX(0)) {
    }
    else if (FIXNUM_P(subsec) && FIX2LONG(subsec) < TIME_SCALE) {
        long len;
        rb_str_catf(str, ".%09ld", FIX2LONG(subsec));
        for (len=RSTRING_LEN(str); RSTRING_PTR(str)[len-1] == '0' && len > 0; len--)
            ;
        rb_str_resize(str, len);
    }
    else {
        rb_str_cat_cstr(str, " ");
        subsec = quov(subsec, INT2FIX(TIME_SCALE));
        rb_str_concat(str, rb_obj_as_string(subsec));
    }
    if (TZMODE_UTC_P(tobj)) {
        rb_str_cat_cstr(str, " UTC");
    }
    else {
        /* ?TODO: subsecond offset */
        long off = NUM2LONG(rb_funcall(tobj->vtm.utc_offset, rb_intern("round"), 0));
        char sign = (off < 0) ? (off = -off, '-') : '+';
        int sec = off % 60;
        int min = (off /= 60) % 60;
        off /= 60;
        rb_str_catf(str, " %c%.2d%.2d", sign, (int)off, min);
        if (sec) rb_str_catf(str, "%.2d", sec);
    }
    return str;
}
isdst
別名為:dst?
iso8601(fraction_digits=0)
別名為:xmlschema
localtime → self or new_time 按一下以切換來源
localtime(zone) → new_time

如果沒有提供引數

  • 如果 self 是當地時間,則傳回 self

  • 否則,傳回使用者當地時區中的新的 Time

    t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
    t.localtime                         # => 2000-01-01 14:15:01 -0600
    

如果提供引數 zone,則傳回將 self 轉換成指定時區後建立的新 Time 物件

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
t.localtime("-09:00")               # => 2000-01-01 11:15:01 -0900

有關參數 時區 的格式,請參閱 時區規格

static VALUE
time_localtime_m(int argc, VALUE *argv, VALUE time)
{
    VALUE off;

    if (rb_check_arity(argc, 0, 1) && !NIL_P(off = argv[0])) {
        return time_zonelocal(time, off);
    }

    return time_localtime(time);
}
別名為:day
min → integer 按一下以切換來源

傳回 self 的小時中的整數分鐘,範圍為 (0..59)

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.min # => 4

相關:Time#yearTime#monTime#sec

static VALUE
time_min(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return INT2FIX(tobj->vtm.min);
}
mon → 整數 按一下以切換來源

傳回 self 的年份中的整數月份,範圍為 (1..12)

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.mon # => 1

相關:Time#yearTime#hourTime#min

static VALUE
time_mon(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return INT2FIX(tobj->vtm.mon);
}
別名為:month
monday? → true 或 false 按一下以切換來源

如果 self 代表星期一,則傳回 true,否則傳回 false

t = Time.utc(2000, 1, 3) # => 2000-01-03 00:00:00 UTC
t.monday?                # => true

相關:Time#tuesday?Time#wednesday?Time#thursday?

static VALUE
time_monday(VALUE time)
{
    wday_p(1);
}
month
別名為:mon
nsec → 整數

傳回 self 中秒數部分的奈秒數,範圍為 (0..999_999_999);較低階的數字會被截斷,而不是四捨五入

t = Time.now # => 2022-07-11 15:04:53.3219637 -0500
t.nsec       # => 321963700

相關:Time#subsec(傳回精確的秒數部分)。

別名為:tv_nsec
rfc2822() 按一下以切換來源

傳回一個字串,表示 RFC 2822 定義的日期時間

day-of-week, DD month-name CCYY hh:mm:ss zone

其中時區為 [+-]hhmm。

如果 self 是 UTC 時間,則 -0000 會用作時區。

require 'time'

t = Time.now
t.rfc2822  # => "Wed, 05 Oct 2011 22:26:12 -0400"

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 672
def rfc2822
  strftime('%a, %d %b %Y %T ') << (utc? ? '-0000' : strftime('%z'))
end
別名為:rfc822
rfc822()
別名為:rfc2822
round(ndigits = 0) → new_time 按一下以切換來源

傳回一個新的 Time 物件,其數值為 self 的數值,且其秒數值已四捨五入到精度 ndigits

t = Time.utc(2010, 3, 30, 5, 43, 25.123456789r)
t          # => 2010-03-30 05:43:25.123456789 UTC
t.round    # => 2010-03-30 05:43:25 UTC
t.round(0) # => 2010-03-30 05:43:25 UTC
t.round(1) # => 2010-03-30 05:43:25.1 UTC
t.round(2) # => 2010-03-30 05:43:25.12 UTC
t.round(3) # => 2010-03-30 05:43:25.123 UTC
t.round(4) # => 2010-03-30 05:43:25.1235 UTC

t = Time.utc(1999, 12,31, 23, 59, 59)
t                # => 1999-12-31 23:59:59 UTC
(t + 0.4).round  # => 1999-12-31 23:59:59 UTC
(t + 0.49).round # => 1999-12-31 23:59:59 UTC
(t + 0.5).round  # => 2000-01-01 00:00:00 UTC
(t + 1.4).round  # => 2000-01-01 00:00:00 UTC
(t + 1.49).round # => 2000-01-01 00:00:00 UTC
(t + 1.5).round  # => 2000-01-01 00:00:01 UTC

相關:Time#ceilTime#floor

static VALUE
time_round(int argc, VALUE *argv, VALUE time)
{
    VALUE ndigits, v, den;
    struct time_object *tobj;

    if (!rb_check_arity(argc, 0, 1) || NIL_P(ndigits = argv[0]))
        den = INT2FIX(1);
    else
        den = ndigits_denominator(ndigits);

    GetTimeval(time, tobj);
    v = w2v(rb_time_unmagnify(tobj->timew));

    v = modv(v, den);
    if (lt(v, quov(den, INT2FIX(2))))
        return time_add(tobj, time, v, -1);
    else
        return time_add(tobj, time, subv(den, v), 1);
}
saturday? → true 或 false 按一下以切換來源

如果 self 代表星期六,則傳回 true,否則傳回 false

t = Time.utc(2000, 1, 1) # => 2000-01-01 00:00:00 UTC
t.saturday?              # => true

相關:Time#sunday?Time#monday?Time#tuesday?

static VALUE
time_saturday(VALUE time)
{
    wday_p(6);
}
sec → 整數 按一下以切換來源

傳回 self 的分鐘中的整數秒數,範圍為 (0..60)

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.sec # => 5

注意:當有 閏秒 時,第二個值可能是 60。

相關:Time#yearTime#monTime#min

static VALUE
time_sec(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return INT2FIX(tobj->vtm.sec);
}
strftime(format_string) → string 按一下以切換來源

傳回一個字串表示 self,格式根據給定的字串 format。請參閱 日期和時間格式

static VALUE
time_strftime(VALUE time, VALUE format)
{
    struct time_object *tobj;
    const char *fmt;
    long len;
    rb_encoding *enc;
    VALUE tmp;

    GetTimeval(time, tobj);
    MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
    StringValue(format);
    if (!rb_enc_str_asciicompat_p(format)) {
        rb_raise(rb_eArgError, "format should have ASCII compatible encoding");
    }
    tmp = rb_str_tmp_frozen_acquire(format);
    fmt = RSTRING_PTR(tmp);
    len = RSTRING_LEN(tmp);
    enc = rb_enc_get(format);
    if (len == 0) {
        rb_warning("strftime called with empty format string");
        return rb_enc_str_new(0, 0, enc);
    }
    else {
        VALUE str = rb_strftime_alloc(fmt, len, enc, time, &tobj->vtm, tobj->timew,
                                      TZMODE_UTC_P(tobj));
        rb_str_tmp_frozen_release(format, tmp);
        if (!str) rb_raise(rb_eArgError, "invalid format: %"PRIsVALUE, format);
        return str;
    }
}
subsec → numeric 按一下以切換來源

傳回 self 的精確次秒,作為 NumericIntegerRational

t = Time.now # => 2022-07-11 15:11:36.8490302 -0500
t.subsec     # => (4245151/5000000)

如果次秒為零,則傳回整數零

t = Time.new(2000, 1, 1, 2, 3, 4) # => 2000-01-01 02:03:04 -0600
t.subsec                          # => 0
static VALUE
time_subsec(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return quov(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE));
}
sunday? → true 或 false 按一下以切換來源

如果 self 表示星期日,則傳回 true,否則傳回 false

t = Time.utc(2000, 1, 2) # => 2000-01-02 00:00:00 UTC
t.sunday?                # => true

相關:Time#monday?Time#tuesday?Time#wednesday?

static VALUE
time_sunday(VALUE time)
{
    wday_p(0);
}
thursday? → true 或 false 按一下以切換來源

如果 self 表示星期四,則傳回 true,否則傳回 false

t = Time.utc(2000, 1, 6) # => 2000-01-06 00:00:00 UTC
t.thursday?              # => true

相關:Time#friday?Time#saturday?Time#sunday?

static VALUE
time_thursday(VALUE time)
{
    wday_p(4);
}
to_a → array 按一下以切換來源

傳回一個 10 個元素的陣列,包含表示 self 的值

Time.utc(2000, 1, 1).to_a
# => [0,   0,   0,    1,   1,   2000, 6,    1,    false, "UTC"]
#    [sec, min, hour, day, mon, year, wday, yday, dst?,   zone]

傳回的陣列適用於作為 Time.utcTime.local 的引數,以建立新的 Time 物件。

static VALUE
time_to_a(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
    return rb_ary_new3(10,
                    INT2FIX(tobj->vtm.sec),
                    INT2FIX(tobj->vtm.min),
                    INT2FIX(tobj->vtm.hour),
                    INT2FIX(tobj->vtm.mday),
                    INT2FIX(tobj->vtm.mon),
                    tobj->vtm.year,
                    INT2FIX(tobj->vtm.wday),
                    INT2FIX(tobj->vtm.yday),
                    RBOOL(tobj->vtm.isdst),
                    time_zone(time));
}
to_date → date 按一下以切換來源

傳回一個 Date 物件,表示 self。

static VALUE
time_to_date(VALUE self)
{
    VALUE y, nth, ret;
    int ry, m, d;

    y = f_year(self);
    m = FIX2INT(f_mon(self));
    d = FIX2INT(f_mday(self));

    decode_year(y, -1, &nth, &ry);

    ret = d_simple_new_internal(cDate,
                                nth, 0,
                                GREGORIAN,
                                ry, m, d,
                                HAVE_CIVIL);
    {
        get_d1(ret);
        set_sg(dat, DEFAULT_SG);
    }
    return ret;
}
to_datetime → datetime 按一下以切換來源

傳回一個 DateTime 物件,表示 self。

static VALUE
time_to_datetime(VALUE self)
{
    VALUE y, sf, nth, ret;
    int ry, m, d, h, min, s, of;

    y = f_year(self);
    m = FIX2INT(f_mon(self));
    d = FIX2INT(f_mday(self));

    h = FIX2INT(f_hour(self));
    min = FIX2INT(f_min(self));
    s = FIX2INT(f_sec(self));
    if (s == 60)
        s = 59;

    sf = sec_to_ns(f_subsec(self));
    of = FIX2INT(f_utc_offset(self));

    decode_year(y, -1, &nth, &ry);

    ret = d_complex_new_internal(cDateTime,
                                 nth, 0,
                                 0, sf,
                                 of, GREGORIAN,
                                 ry, m, d,
                                 h, min, s,
                                 HAVE_CIVIL | HAVE_TIME);
    {
        get_d1(ret);
        set_sg(dat, DEFAULT_SG);
    }
    return ret;
}
to_f → float 按一下以切換來源

傳回 self 的值,作為 Float 數字 Epoch 秒;包含次秒。

self 的儲存值為 Rational,這表示傳回的值可能是近似值

Time.utc(1970, 1, 1, 0, 0, 0).to_f         # => 0.0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_f # => 0.999999
Time.utc(1950, 1, 1, 0, 0, 0).to_f         # => -631152000.0
Time.utc(1990, 1, 1, 0, 0, 0).to_f         # => 631152000.0

相關:Time#to_iTime#to_r

static VALUE
time_to_f(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return rb_Float(rb_time_unmagnify_to_float(tobj->timew));
}
to_i → integer 按一下以切換來源

傳回 self 的值,作為整數 Epoch 秒;次秒會被截斷(不會四捨五入)

Time.utc(1970, 1, 1, 0, 0, 0).to_i         # => 0
Time.utc(1970, 1, 1, 0, 0, 0, 999999).to_i # => 0
Time.utc(1950, 1, 1, 0, 0, 0).to_i         # => -631152000
Time.utc(1990, 1, 1, 0, 0, 0).to_i         # => 631152000

相關:Time#to_f Time#to_r

static VALUE
time_to_i(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE)));
}
別名為:tv_sec
to_json(*args) 按一下以切換來源

傳回一個表示selfJSON字串

require 'json/add/time'
puts Time.now.to_json

輸出

{"json_class":"Time","s":1700931678,"n":980650786}
# File ext/json/lib/json/add/time.rb, line 56
def to_json(*args)
  as_json.to_json(*args)
end
to_r → rational 按一下以切換來源

傳回self的值,作為Rational精確數字的Epoch 秒數

Time.now.to_r # => (16571402750320203/10000000)

相關:Time#to_fTime#to_i

static VALUE
time_to_r(VALUE time)
{
    struct time_object *tobj;
    VALUE v;

    GetTimeval(time, tobj);
    v = rb_time_unmagnify_to_rational(tobj->timew);
    if (!RB_TYPE_P(v, T_RATIONAL)) {
        v = rb_Rational1(v);
    }
    return v;
}
to_s → string 按一下以切換來源

傳回self的字串表示,不含次秒

t = Time.new(2000, 12, 31, 23, 59, 59, 0.5)
t.to_s    # => "2000-12-31 23:59:59 +0000"

相關:Time#ctimeTime#inspect

t.ctime   # => "Sun Dec 31 23:59:59 2000"
t.inspect # => "2000-12-31 23:59:59.5 +000001"
static VALUE
time_to_s(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    if (TZMODE_UTC_P(tobj))
        return strftimev("%Y-%m-%d %H:%M:%S UTC", time, rb_usascii_encoding());
    else
        return strftimev("%Y-%m-%d %H:%M:%S %z", time, rb_usascii_encoding());
}
to_time → time 按一下以切換來源

傳回 self。

static VALUE
time_to_time(VALUE self)
{
    return self;
}
tuesday? → true 或 false 按一下以切換來源

如果self表示星期二,傳回true,否則傳回false

t = Time.utc(2000, 1, 4) # => 2000-01-04 00:00:00 UTC
t.tuesday?               # => true

相關:Time#wednesday?Time#thursday?Time#friday?

static VALUE
time_tuesday(VALUE time)
{
    wday_p(2);
}
tv_nsec
別名為:nsec
tv_sec
別名為:to_i
tv_usec
別名為:usec
usec → 整數

傳回self次秒部分的微秒數,範圍為 (0..999_999);較低位數的數字會被截斷,不會四捨五入

t = Time.now # => 2022-07-11 14:59:47.5484697 -0500
t.usec       # => 548469

相關:Time#subsec(傳回精確的秒數部分)。

別名為:tv_usec
utc → self

傳回self,已轉換為 UTC 時區

t = Time.new(2000) # => 2000-01-01 00:00:00 -0600
t.utc?             # => false
t.utc              # => 2000-01-01 06:00:00 UTC
t.utc?             # => true

相關:Time#getutc(傳回新的已轉換Time物件)。

別名為:gmtime
utc? → true 或 false 按一下以切換來源

如果self表示 UTC (GMT) 中的時間,傳回true

now = Time.now
# => 2022-08-18 10:24:13.5398485 -0500
now.utc? # => false
utc = Time.utc(2000, 1, 1, 20, 15, 1)
# => 2000-01-01 20:15:01 UTC
utc.utc? # => true

相關:Time.utc

static VALUE
time_utc_p(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    return RBOOL(TZMODE_UTC_P(tobj));
}
別名為:gmt?
utc_offset → 整數

傳回 UTC 和self時區之間的秒數偏移量

Time.utc(2000, 1, 1).utc_offset   # => 0
Time.local(2000, 1, 1).utc_offset # => -21600 # -6*3600, or minus six hours.
別名為:gmtoff
wday → 整數 按一下以切換來源

傳回self的星期幾整數,範圍為 (0..6),星期日為零。

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.wday    # => 0
t.sunday? # => true

相關:Time#yearTime#hourTime#min

static VALUE
time_wday(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM_ENSURE(time, tobj, tobj->vtm.wday != VTM_WDAY_INITVAL);
    return INT2FIX((int)tobj->vtm.wday);
}
wednesday? → true 或 false 按一下以切換來源

如果self表示星期三,傳回true,否則傳回false

t = Time.utc(2000, 1, 5) # => 2000-01-05 00:00:00 UTC
t.wednesday?             # => true

相關:Time#thursday?Time#friday?Time#saturday?

static VALUE
time_wednesday(VALUE time)
{
    wday_p(3);
}
xmlschema(fraction_digits=0) 按一下以切換來源

傳回一個字串,表示 XML Schema 定義的日期時間

CCYY-MM-DDThh:mm:ssTZD
CCYY-MM-DDThh:mm:ss.sssTZD

其中 TZD 為 Z 或 [+-]hh:mm。

如果 self 是 UTC 時間,則 TZD 使用 Z。否則使用 [+-]hh:mm。

fraction_digits 指定用於小數秒的位數。其預設值為 0。

require 'time'

t = Time.now
t.iso8601  # => "2011-10-05T22:26:12-04:00"

您必須需要「時間」才能使用此方法。

# File lib/time.rb, line 717
def xmlschema(fraction_digits=0)
  fraction_digits = fraction_digits.to_i
  s = strftime("%FT%T")
  if fraction_digits > 0
    s << strftime(".%#{fraction_digits}N")
  end
  s << (utc? ? 'Z' : strftime("%:z"))
end
別名為:iso8601
yday → 整數 按一下以切換來源

傳回 self 的年度中的整數天,範圍為 (1..366)。

Time.new(2000, 1, 1).yday   # => 1
Time.new(2000, 12, 31).yday # => 366
static VALUE
time_yday(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM_ENSURE(time, tobj, tobj->vtm.yday != 0);
    return INT2FIX(tobj->vtm.yday);
}
year → 整數 按一下以切換來源

傳回 self 的整數年

t = Time.new(2000, 1, 2, 3, 4, 5, 6)
# => 2000-01-02 03:04:05 +000006
t.year # => 2000

相關:Time#monTime#hourTime#min

static VALUE
time_year(VALUE time)
{
    struct time_object *tobj;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);
    return tobj->vtm.year;
}
zone → 字串或時區 按一下以切換來源

傳回 self 的時區字串名稱

Time.utc(2000, 1, 1).zone # => "UTC"
Time.new(2000, 1, 1).zone # => "Central Standard Time"
static VALUE
time_zone(VALUE time)
{
    struct time_object *tobj;
    VALUE zone;

    GetTimeval(time, tobj);
    MAKE_TM(time, tobj);

    if (TZMODE_UTC_P(tobj)) {
        return rb_usascii_str_new_cstr("UTC");
    }
    zone = tobj->vtm.zone;
    if (NIL_P(zone))
        return Qnil;

    if (RB_TYPE_P(zone, T_STRING))
        zone = rb_str_dup(zone);
    return zone;
}