日期和时间格式

多个 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 格式,请参见上面的 日期时间