日期和時間格式

多個 Ruby 時間相關類別有實例方法 strftime,它會傳回一個格式化字串,用以表示日期或時間的全部或部分

這些方法各會接收一個選用引數 format,其中包含零個或多個內嵌的格式規格(請參閱下方)。

這些方法各會傳回字串,該字串是將 format 中內嵌的每個格式規格替換為日期或時間某個或多個部分的字串形式所產生的結果。

一個簡單的範例

Time.now.strftime('%H:%M:%S') # => "14:02:07"

格式規格的形式如下

%[flags][width]conversion

它包含

除了開頭的百分比字元,唯一必要的部份是轉換規格,因此我們從那裡開始。

轉換規格

日期(年、月、日)

時間(小時、分鐘、秒、次秒)

時區

星期

星期數

星期日期

請參閱 ISO 8601 星期日期

t0 = Time.new(2023, 1, 1) # => 2023-01-01 00:00:00 -0600
t1 = Time.new(2024, 1, 1) # => 2024-01-01 00:00:00 -0600

字面量

簡寫轉換規格符

這裡的每個簡寫規格符都顯示了其對應的長規格符。

標記

標記可能會影響某些格式化規格。

可以使用單個轉換指定的標記給出多個標記;順序無關緊要。

填充標記

大小寫標記

時區標記

寬度規格符

整數寬度說明符會提供傳回字串的最小寬度

Time.new(2002).strftime('%Y')       # => "2002"     # No width specifier.
Time.new(2002).strftime('%10Y')     # => "0000002002"
Time.new(2002, 12).strftime('%B')   # => "December" # No width specifier.
Time.new(2002, 12).strftime('%10B') # => "  December"
Time.new(2002, 12).strftime('%3B')  # => "December" # Ignored if too small.

特殊格式字串

以下是一些特殊格式字串,每個字串都基於外部標準。

HTTP 格式

HTTP 日期格式基於 RFC 2616,並以 '%a, %d %b %Y %T GMT' 格式處理日期

d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return HTTP-formatted string.
httpdate = d.httpdate    # => "Sat, 03 Feb 2001 00:00:00 GMT"
# Return new date parsed from HTTP-formatted string.
Date.httpdate(httpdate)  # => #<Date: 2001-02-03>
# Return hash parsed from HTTP-formatted string.
Date._httpdate(httpdate)
# => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"GMT", :offset=>0}

RFC 3339 格式

RFC 3339 日期格式基於 RFC 3339

d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 3339-formatted string.
rfc3339 = d.rfc3339      # => "2001-02-03T00:00:00+00:00"
# Return new date parsed from 3339-formatted string.
Date.rfc3339(rfc3339)    # => #<Date: 2001-02-03>
# Return hash parsed from 3339-formatted string.
Date._rfc3339(rfc3339)
# => {:year=>2001, :mon=>2, :mday=>3, :hour=>0, :min=>0, :sec=>0, :zone=>"+00:00", :offset=>0}

RFC 2822 格式

RFC 2822 日期格式基於 RFC 2822,並以 '%a, %-d %b %Y %T %z' 格式處理日期]

d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 2822-formatted string.
rfc2822 = d.rfc2822      # => "Sat, 3 Feb 2001 00:00:00 +0000"
# Return new date parsed from 2822-formatted string.
Date.rfc2822(rfc2822)    # => #<Date: 2001-02-03>
# Return hash parsed from 2822-formatted string.
Date._rfc2822(rfc2822)
# => {:wday=>6, :mday=>3, :mon=>2, :year=>2001, :hour=>0, :min=>0, :sec=>0, :zone=>"+0000", :offset=>0}

JIS X 0301 格式

JIS X 0301 格式包含 日本年號,並以 '%Y-%m-%d' 格式處理日期,並加上羅馬化年號的第一個字母作為前綴

d = Date.new(2001, 2, 3) # => #<Date: 2001-02-03>
# Return 0301-formatted string.
jisx0301 = d.jisx0301    # => "H13.02.03"
# Return new date parsed from 0301-formatted string.
Date.jisx0301(jisx0301)  # => #<Date: 2001-02-03>
# Return hash parsed from 0301-formatted string.
Date._jisx0301(jisx0301) # => {:year=>2001, :mon=>2, :mday=>3}

ISO 8601 格式規格

本節顯示與 ISO 8601 相容的格式規格。可以在連結中看到各種格式的詳細資料。

本節中的範例假設

t = Time.now # => 2022-06-29 16:49:25.465246 -0500

日期

請參閱 ISO 8601 日期

時間

請參閱 ISO 8601 時間

日期時間組合

請參閱 ISO 8601 日期時間組合表示

ISO 8601 日期時間組合表示可以是任何 ISO 8601 日期和任何 ISO 8601 時間,中間以字母 T 分隔。

有關相關的 strftime 格式,請參閱上方的 日期時間