日期和时间格式

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 组合日期和时间表示可以是以字母 T 分隔的任何 ISO 8601 日期和任何 ISO 8601 时间。

对于相关的 strftime 格式,请参阅上文的 日期时间