日期和时间格式

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