類別時間
時間
物件表示日期和時間
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_i
和 Time#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.local
和 Time.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
-
繼承自 類別 Object。
-
包含 模組 Comparable。
在此,類別 Time
提供下列方法,對下列事項很有用:
-
{建立
Time
物件}[rdoc-ref:Time@Methods+for+Creating]。 -
{擷取
Time
值}[rdoc-ref:Time@Methods+for+Fetching]。 -
{查詢
Time
物件}[rdoc-ref:Time@Methods+for+Querying]。 -
{比較
Time
物件}[rdoc-ref:Time@Methods+for+Comparing]。 -
{轉換
Time
物件}[rdoc-ref:Time@Methods+for+Converting]。 -
{捨入
Time
}。
建立方法¶ ↑
-
::new
:根據指定的引數(年份、月份等),傳回新的時間,包括時區的選用值。 -
::at
:根據紀元以來的秒數,傳回新的時間。 -
::now
:根據目前的系統時間,傳回新的時間。 -
+
(加):傳回新的時間,並增加指定的秒數。 -
-
(減):傳回新的時間,並減少指定的秒數。
擷取方法¶ ↑
-
year
:傳回時間的年份。 -
hour
:傳回時間的小時值。 -
min
:傳回時間的分鐘值。 -
sec
:傳回時間的秒數值。 -
subsec
:傳回時間的子秒數值。 -
wday
:傳回時間的整數星期數值(0 == 星期日)。 -
yday
:傳回時間的整數年日值(1 == 1 月 1 日)。 -
hash
:傳回時間的整數雜湊值。 -
utc_offset
(別名為gmt_offset
和gmtoff
):傳回時間與 UTC 之間的秒數偏移量。 -
to_f
:傳回時間自紀元以來的浮點秒數。 -
zone
:傳回時間時區的字串表示形式。
查詢方法¶ ↑
-
sunday?
:傳回時間是否為星期日。 -
monday?
:傳回時間是否為星期一。 -
tuesday?
:傳回時間是否為星期二。 -
wednesday?
:傳回時間是否為星期三。 -
thursday?
:傳回時間是否為星期四。 -
friday?
:傳回時間是否為星期五。 -
saturday?
:回傳時間是否為星期六。
用於比較的函式¶ ↑
用於轉換的函式¶ ↑
-
inspect
:將時間詳細資訊回傳為字串。 -
strftime
:依據給定的格式將時間回傳為字串。 -
to_a
:回傳時間的 10 個元素陣列值。 -
to_s
:回傳時間的字串表示形式。 -
getlocal
:回傳轉換為當地時間的新時間。 -
localtime
:將時間轉換為當地時間。 -
deconstruct_keys
:回傳用於模式比對的時間元件雜湊。
用於四捨五入的函式¶ ↑
有關參數 zone
的形式,請參閱 時區規格。
時區規格¶ ↑
某些 Time
函式接受指定時區的參數
-
Time.at
:關鍵字參數in:
。 -
Time.new
:位置參數zone
或關鍵字參數in:
。 -
Time.now
:關鍵字參數in:
。 -
Time#getlocal
:位置參數zone
。 -
Time#localtime
:位置參數zone
。
在其中任何一個參數中給定的值都必須符合下列其中一項(下方詳細說明)
小時/分鐘偏移量¶ ↑
時區值可能是從 UTC 偏移的字串,格式為 '+HH:MM'
或 '-HH:MM'
,其中
-
HH
是範圍在0..23
的 2 位數小時。 -
MM
是範圍在0..59
的 2 位數分鐘。
範例
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
時區物件¶ ↑
時區值可能是回應某些時區方法的物件,例如 Timezone 和 TZInfo 的執行個體。
時區方法為
-
local_to_utc
: -
utc_to_local
:-
當使用
tz
作為關鍵字引數in:
的值呼叫Time.at
或Time.now
,以及當使用tz
作為位置引數zone
的值呼叫Time#getlocal
或Time#localtime
時呼叫。 -
引數:類時間物件。
-
傳回:當地時區中的 類時間物件。
-
自訂時區類別可能有這些執行個體方法,如果已定義,會呼叫這些方法
-
abbr
:-
當使用包含
%Z
的格式呼叫Time#strftime
時呼叫。 -
引數:類時間物件。
-
傳回:時區名稱的縮寫字串。
-
-
dst?
:-
當使用
tz
作為關鍵字引數in:
的值呼叫Time.at
或Time.now
,以及當使用tz
作為位置引數zone
的值呼叫Time#getlocal
或Time#localtime
時呼叫。 -
引數:類時間物件。
-
傳回:時間是否為夏令時間。
-
-
name
:-
當呼叫
Marshal.dump(t)
時呼叫 -
引數:無。
-
傳回:時區的字串名稱。
-
Time
類似物件¶ ↑
Time
類似物件是容器物件,能夠與時區函式庫介面進行時區轉換。
上述時區轉換方法的引數會有類似於 Time
的屬性,但與時區相關的屬性沒有意義。
時區物件的 local_to_utc
和 utc_to_local
方法傳回的物件可能是與其引數相同的類別、任意物件類別或 Integer
類別。
對於 Integer
以外的傳回類別,類別必須有下列方法
-
年
-
月
-
日
-
時
-
分
-
秒
-
isdst
-
to_i
對於回傳的 整數
,其組成部分在 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
公開類別方法
根據給定的引數回傳一個新的 時間
物件。
必要的引數 時間
可以是下列任一者
-
一個
時間
物件,其值是回傳時間的基礎;也受選擇性的關鍵字引數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
將 日期
解析為 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
請參閱 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
與 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))); }
傳回一個新的 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
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
取得 時間
的字串表示形式,並嘗試使用啟發法來分析它。
此方法 **不會** 作為驗證器。如果輸入字串不完全符合有效格式,您可能會得到難以理解的結果。應考慮使用「時間.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
我們可以透過傳遞第二個物件來變更用於推論遺失元素的日期,該物件會回應 mon
、day
和 year
,例如 日期
、時間
或 日期時間
。我們也可以使用自己的物件。
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
將 日期
分析為 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
運作方式類似於 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 時區。
給定一個到七個引數,引數會根據上面第一個呼叫順序來詮釋
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
為零,則為 60Time.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))); }
將 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
傳回指定時區與 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
公開實例方法
傳回新的 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); }
當給定 numeric
時,傳回新的 Time
物件,其值為 self
與 numeric
的數值差異
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
,其值為 self
與 other_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
,如果self
小於other_time
。 -
0
,如果self
等於other_time
。 -
1
,如果self
大於other_time
。 -
nil
,如果self
與other_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); }
方法 Time#as_json
和 Time.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
傳回新的 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#floor
、Time#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); }
傳回 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"
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()); }
傳回名稱/值配對的雜湊,用於模式比對。可能的鍵::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; }
如果 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
如果 self
和 other_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; }
傳回新的 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#ceil
、Time#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); }
如果 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); }
傳回一個新的 Time
物件,表示 self
的值轉換成指定的時區;如果 zone
為 nil
,則使用本機時區
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)); }
傳回一個新的 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
傳回 self
的整數雜湊碼。
相關:Object#hash
。
static VALUE time_hash(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_hash(w2v(tobj->timew)); }
傳回一個字串,表示 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
傳回 self
的字串表示形式,包含次秒
t = Time.new(2000, 12, 31, 23, 59, 59, 0.5) t.inspect # => "2000-12-31 23:59:59.5 +000001"
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; }
如果沒有提供引數
-
如果
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); }
傳回 self
的年份中的整數月份,範圍為 (1..12)
t = Time.new(2000, 1, 2, 3, 4, 5, 6) # => 2000-01-02 03:04:05 +000006 t.mon # => 1
相關:Time#year
、Time#hour
、Time#min
。
static VALUE time_mon(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.mon); }
如果 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); }
傳回 self
中秒數部分的奈秒數,範圍為 (0..999_999_999);較低階的數字會被截斷,而不是四捨五入
t = Time.now # => 2022-07-11 15:04:53.3219637 -0500 t.nsec # => 321963700
相關:Time#subsec
(傳回精確的秒數部分)。
傳回一個字串,表示 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
傳回一個新的 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#ceil
、Time#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); }
如果 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); }
傳回 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#year
、Time#mon
、Time#min
。
static VALUE time_sec(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); MAKE_TM(time, tobj); return INT2FIX(tobj->vtm.sec); }
傳回一個字串表示 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; } }
傳回 self
的精確次秒,作為 Numeric
(Integer
或 Rational
)
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)); }
如果 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); }
如果 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); }
傳回一個 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.utc
或 Time.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)); }
傳回一個 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; }
傳回一個 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; }
傳回 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
static VALUE time_to_f(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return rb_Float(rb_time_unmagnify_to_float(tobj->timew)); }
傳回 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
static VALUE time_to_i(VALUE time) { struct time_object *tobj; GetTimeval(time, tobj); return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))); }
傳回一個表示self
的JSON
字串
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
傳回self
的字串表示,不含次秒
t = Time.new(2000, 12, 31, 23, 59, 59, 0.5) t.to_s # => "2000-12-31 23:59:59 +0000"
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()); }
傳回 self。
static VALUE time_to_time(VALUE self) { return self; }
如果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); }
傳回self
次秒部分的微秒數,範圍為 (0..999_999);較低位數的數字會被截斷,不會四捨五入
t = Time.now # => 2022-07-11 14:59:47.5484697 -0500 t.usec # => 548469
相關:Time#subsec
(傳回精確的秒數部分)。
傳回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
物件)。
如果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)); }
傳回 UTC 和self
時區之間的秒數偏移量
Time.utc(2000, 1, 1).utc_offset # => 0 Time.local(2000, 1, 1).utc_offset # => -21600 # -6*3600, or minus six hours.
傳回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#year
、Time#hour
、Time#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); }
如果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); }
傳回一個字串,表示 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
傳回 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); }
傳回 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; }