日期和时间格式

一些 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 格式,请参阅上面的日期时间部分。