日期和時間格式¶ ↑
多個 Ruby 時間相關類別有實例方法 strftime
,它會傳回一個格式化字串,用以表示日期或時間的全部或部分
這些方法各會接收一個選用引數 format
,其中包含零個或多個內嵌的格式規格(請參閱下方)。
這些方法各會傳回字串,該字串是將 format
中內嵌的每個格式規格替換為日期或時間某個或多個部分的字串形式所產生的結果。
一個簡單的範例
Time.now.strftime('%H:%M:%S') # => "14:02:07"
格式規格的形式如下
%[flags][width]conversion
它包含
-
一個開頭的百分比字元。
-
零個或多個旗標(每個都是一個字元)。
-
一個選用的寬度規格(一個整數)。
-
一個轉換規格(一個字元)。
除了開頭的百分比字元,唯一必要的部份是轉換規格,因此我們從那裡開始。
轉換規格¶ ↑
日期(年、月、日)¶ ↑
-
%Y
- 包含世紀的年份,以零補齊Time.now.strftime('%Y') # => "2022" Time.new(-1000).strftime('%Y') # => "-1000" # Before common era. Time.new(10000).strftime('%Y') # => "10000" # Far future. Time.new(10).strftime('%Y') # => "0010" # Zero-padded by default.
-
%y
- 不含世紀的年份,範圍(0.99),以零補齊Time.now.strftime('%y') # => "22" Time.new(1).strftime('%y') # => "01" # Zero-padded by default.
-
%C
- 世紀,以零補齊Time.now.strftime('%C') # => "20" Time.new(-1000).strftime('%C') # => "-10" # Before common era. Time.new(10000).strftime('%C') # => "100" # Far future. Time.new(100).strftime('%C') # => "01" # Zero-padded by default.
-
%m
- 一年中的月份,範圍(1..12),以零補齊Time.new(2022, 1).strftime('%m') # => "01" # Zero-padded by default. Time.new(2022, 12).strftime('%m') # => "12"
-
%B
- 完整的月份名稱,大寫Time.new(2022, 1).strftime('%B') # => "January" Time.new(2022, 12).strftime('%B') # => "December"
-
%b
- 縮寫的月份名稱,大寫Time.new(2022, 1).strftime('%b') # => "Jan" Time.new(2022, 12).strftime('%h') # => "Dec"
-
%h
- 與%b
相同。 -
%d
- 一個月中的日期,範圍(1..31),以零補齊Time.new(2002, 1, 1).strftime('%d') # => "01" Time.new(2002, 1, 31).strftime('%d') # => "31"
-
%e
- 一個月中的日期,範圍(1..31),以空白補齊Time.new(2002, 1, 1).strftime('%e') # => " 1" Time.new(2002, 1, 31).strftime('%e') # => "31"
-
%j
- 一年中的第幾天,範圍(1..366),以零補齊Time.new(2002, 1, 1).strftime('%j') # => "001" Time.new(2002, 12, 31).strftime('%j') # => "365"
時間(小時、分鐘、秒、次秒)¶ ↑
-
%H
- 一天中的小時,範圍(0..23),以零補齊Time.new(2022, 1, 1, 1).strftime('%H') # => "01" Time.new(2022, 1, 1, 13).strftime('%H') # => "13"
-
%k
- 一天中的小時,範圍(0..23),以空白補齊Time.new(2022, 1, 1, 1).strftime('%k') # => " 1" Time.new(2022, 1, 1, 13).strftime('%k') # => "13"
-
%I
- 一天中的小時,範圍(1..12),以零補齊Time.new(2022, 1, 1, 1).strftime('%I') # => "01" Time.new(2022, 1, 1, 13).strftime('%I') # => "01"
-
%l
- 一天中的小時,範圍(1..12),以空白補齊Time.new(2022, 1, 1, 1).strftime('%l') # => " 1" Time.new(2022, 1, 1, 13).strftime('%l') # => " 1"
-
%P
- 子午線指標,小寫Time.new(2022, 1, 1, 1).strftime('%P') # => "am" Time.new(2022, 1, 1, 13).strftime('%P') # => "pm"
-
%p
- 子午線指標,大寫Time.new(2022, 1, 1, 1).strftime('%p') # => "AM" Time.new(2022, 1, 1, 13).strftime('%p') # => "PM"
-
%M
- 一小時中的分鐘,範圍(0..59),以零補齊Time.new(2022, 1, 1, 1, 0, 0).strftime('%M') # => "00"
-
%S
- 一分鐘中的秒,範圍(0..59),以零補齊Time.new(2022, 1, 1, 1, 0, 0, 0).strftime('%S') # => "00"
-
%L
- 一秒中的毫秒,範圍(0..999),以零補齊Time.new(2022, 1, 1, 1, 0, 0, 0).strftime('%L') # => "000"
-
%N
- 分數秒,預設寬度為 9 個數字(奈秒)t = Time.now # => 2022-06-29 07:10:20.3230914 -0500 t.strftime('%N') # => "323091400" # Default.
使用 寬度規格 調整單位
t.strftime('%3N') # => "323" # Milliseconds. t.strftime('%6N') # => "323091" # Microseconds. t.strftime('%9N') # => "323091400" # Nanoseconds. t.strftime('%12N') # => "323091400000" # Picoseconds. t.strftime('%15N') # => "323091400000000" # Femptoseconds. t.strftime('%18N') # => "323091400000000000" # Attoseconds. t.strftime('%21N') # => "323091400000000000000" # Zeptoseconds. t.strftime('%24N') # => "323091400000000000000000" # Yoctoseconds.
-
%s
- 自紀元以來的秒數Time.now.strftime('%s') # => "1656505136"
時區¶ ↑
-
%z
- 時區為與 UTC 的小時和分鐘偏移量Time.now.strftime('%z') # => "-0500"
-
%Z
- 時區名稱(與平台相關)Time.now.strftime('%Z') # => "Central Daylight Time"
星期¶ ↑
-
%A
- 完整的星期名稱Time.now.strftime('%A') # => "Wednesday"
-
%a
- 縮寫的星期名稱Time.now.strftime('%a') # => "Wed"
-
%u
- 星期中的第幾天,範圍 (1..7),星期一是 1t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%u') # => "7"
-
%w
- 星期中的第幾天,範圍 (0..6),星期日是 0t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%w') # => "0"
星期數¶ ↑
-
%U
- 一年中的星期數,範圍 (0..53),零填充,每個星期從星期日開始t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%U') # => "26"
-
%W
- 一年中的星期數,範圍 (0..53),零填充,每個星期從星期一開始t = Time.new(2022, 6, 26) # => 2022-06-26 00:00:00 -0500 t.strftime('%a') # => "Sun" t.strftime('%W') # => "25"
星期日期¶ ↑
請參閱 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
-
%G
- 以星期為基礎的年份t0.strftime('%G') # => "2022" t1.strftime('%G') # => "2024"
-
%g
- 不含世紀的以星期為基礎的年份,範圍 (0..99),零填充t0.strftime('%g') # => "22" t1.strftime('%g') # => "24"
-
%V
- 以星期為基礎的年份的星期數,範圍 (1..53),零填充t0.strftime('%V') # => "52" t1.strftime('%V') # => "01"
字面量¶ ↑
-
%n
- 換行字元 “n”Time.now.strftime('%n') # => "\n"
-
%t
- Tab 字元 “t”Time.now.strftime('%t') # => "\t"
-
%%
- 百分號 ‘%’Time.now.strftime('%%') # => "%"
簡寫轉換規格符¶ ↑
這裡的每個簡寫規格符都顯示了其對應的長規格符。
-
%c
- 日期和時間Time.now.strftime('%c') # => "Wed Jun 29 08:01:41 2022" Time.now.strftime('%a %b %e %T %Y') # => "Wed Jun 29 08:02:07 2022"
-
%D
- 日期Time.now.strftime('%D') # => "06/29/22" Time.now.strftime('%m/%d/%y') # => "06/29/22"
-
%F
- ISO 8601 日期Time.now.strftime('%F') # => "2022-06-29" Time.now.strftime('%Y-%m-%d') # => "2022-06-29"
-
%v
- VMS 日期Time.now.strftime('%v') # => "29-JUN-2022" Time.now.strftime('%e-%^b-%4Y') # => "29-JUN-2022"
-
%x
- 與%D
相同。 -
%X
- 與%T
相同。 -
%r
- 12 小時制時間Time.new(2022, 1, 1, 1).strftime('%r') # => "01:00:00 AM" Time.new(2022, 1, 1, 1).strftime('%I:%M:%S %p') # => "01:00:00 AM" Time.new(2022, 1, 1, 13).strftime('%r') # => "01:00:00 PM" Time.new(2022, 1, 1, 13).strftime('%I:%M:%S %p') # => "01:00:00 PM"
-
%R
- 24 小時制時間Time.new(2022, 1, 1, 1).strftime('%R') # => "01:00" Time.new(2022, 1, 1, 1).strftime('%H:%M') # => "01:00" Time.new(2022, 1, 1, 13).strftime('%R') # => "13:00" Time.new(2022, 1, 1, 13).strftime('%H:%M') # => "13:00"
-
%T
- 24 小時制時間Time.new(2022, 1, 1, 1).strftime('%T') # => "01:00:00" Time.new(2022, 1, 1, 1).strftime('%H:%M:%S') # => "01:00:00" Time.new(2022, 1, 1, 13).strftime('%T') # => "13:00:00" Time.new(2022, 1, 1, 13).strftime('%H:%M:%S') # => "13:00:00"
-
%+
(在Time#strftime
中不受支援) - 日期和時間DateTime.now.strftime('%+') # => "Wed Jun 29 08:31:53 -05:00 2022" DateTime.now.strftime('%a %b %e %H:%M:%S %Z %Y') # => "Wed Jun 29 08:32:18 -05:00 2022"
標記¶ ↑
標記可能會影響某些格式化規格。
可以使用單個轉換指定的標記給出多個標記;順序無關緊要。
填充標記¶ ↑
-
0
- 用零填充Time.new(10).strftime('%0Y') # => "0010"
-
_
- 用空白填充Time.new(10).strftime('%_Y') # => " 10"
-
-
- 不填充Time.new(10).strftime('%-Y') # => "10"
大小寫標記¶ ↑
-
^
- 將結果轉換為大寫Time.new(2022, 1).strftime('%B') # => "January" # No casing flag. Time.new(2022, 1).strftime('%^B') # => "JANUARY"
-
#
- 將結果轉換為大小寫Time.now.strftime('%p') # => "AM" Time.now.strftime('%^p') # => "AM" Time.now.strftime('%#p') # => "am"
時區標記¶ ↑
-
:
- 將時區設定為冒號分隔的小時和分鐘Time.now.strftime('%:z') # => "-05:00"
-
::
- 將時區設定為冒號分隔的小時、分鐘和秒Time.now.strftime('%::z') # => "-05:00:00"
寬度規格符¶ ↑
整數寬度說明符會提供傳回字串的最小寬度
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 日期。
-
年份:
-
基本年份 (
YYYY
)t.strftime('%Y') # => "2022"
-
擴充年份 (
±YYYYY
)t.strftime('+%5Y') # => "+02022" t.strftime('-%5Y') # => "-02022"
-
-
日曆日期:
-
基本日期 (
YYYYMMDD
)t.strftime('%Y%m%d') # => "20220629"
-
擴充日期 (
YYYY-MM-DD
)t.strftime('%Y-%m-%d') # => "2022-06-29"
-
簡化擴充日期 (
YYYY-MM
)t.strftime('%Y-%m') # => "2022-06"
-
-
週日期:
-
基本日期 (
YYYYWww
或YYYYWwwD
)t.strftime('%Y%Ww') # => "202226w" t.strftime('%Y%Ww%u') # => "202226w3"
-
擴充日期 (
YYYY-Www
或 <tt>YYYY-Www-D<tt>)t.strftime('%Y-%Ww') # => "2022-26w" t.strftime('%Y-%Ww-%u') # => "2022-26w-3"
-
-
序數日期:
-
基本日期 (
YYYYDDD
)t.strftime('%Y%j') # => "2022180"
-
擴充日期 (
YYYY-DDD
)t.strftime('%Y-%j') # => "2022-180"
-
時間¶ ↑
請參閱 ISO 8601 時間。
-
時間
-
基本時間 (
Thhmmss.sss
、Thhmmss
、Thhmm
或Thh
)t.strftime('T%H%M%S.%L') # => "T164925.465" t.strftime('T%H%M%S') # => "T164925" t.strftime('T%H%M') # => "T1649" t.strftime('T%H') # => "T16"
-
擴充時間 (
Thh:mm:ss.sss
、Thh:mm:ss
或Thh:mm
)t.strftime('T%H:%M:%S.%L') # => "T16:49:25.465" t.strftime('T%H:%M:%S') # => "T16:49:25" t.strftime('T%H:%M') # => "T16:49"
-
-
時區標示:
-
時區 (
time
代表有效時間,hh
代表有效的 2 位數小時,mm
代表有效的 2 位數分鐘)-
基本時區 (
time±hhmm
、time±hh
或timeZ
)t.strftime('T%H%M%S%z') # => "T164925-0500" t.strftime('T%H%M%S%z').slice(0..-3) # => "T164925-05" t.strftime('T%H%M%SZ') # => "T164925Z"
-
延伸時區 (
time±hh:mm
)t.strftime('T%H:%M:%S%z') # => "T16:49:25-0500"
-
-
另請參閱
-
日期時間組合¶ ↑
請參閱 ISO 8601 日期時間組合表示。
ISO 8601 日期時間組合表示可以是任何 ISO 8601 日期和任何 ISO 8601 時間,中間以字母 T
分隔。