日期和时间格式¶ ↑
几个 Ruby 与时间相关的类都有实例方法 strftime
,它返回一个格式化的字符串,表示日期或时间的全部或部分。
-
Date#strftime。
-
DateTime#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
- 制表符 “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
代表有效两位数小时,mm
代表有效两位数分钟)-
基本时区 (
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 时间,用字母 T
分隔。