日期和时间格式
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- 制表符“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或YYYY-Www-D)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 组合日期和时间表示可以是以字母 T 分隔的任何 ISO 8601 日期和任何 ISO 8601 时间。