日期和时间格式¶ ↑
多个 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
- 以小时和分钟的偏移量表示的时区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
表示有效的 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 时间,用字母 T
分隔。