给不耐烦的人的strftime
有时例子胜过千言万语,所以这里有一些可以马上帮助你的例子(例子的灵感来自APIDoks)。
d = DateTime.new(2021,11,19,8,37,48,"-06:00")
# => Fri, 19 Nov 2021 08:37:48 -0600
d.strftime("Printed on %m/%d/%Y")
# => "Printed on 11/19/2021"
d.strftime("at %I:%M%p")
# => "at 08:37AM"
还有更多的原始例子(下面几段的解释)。
%Y%m%d => 20211119
%F => 2021-11-19
%Y-%m => 2021-11
%Y => 2021
%C => 20
%Y%j => 2021323
%Y-%j => 2021-323
%GW%V%u => 2021W471
%G-W%V-%u => 2021-W47-1
%GW%V => 2021W47
%G-W%V => 2021-W47
%H%M%S => 083748
%T => 08:37:48
%H%M => 0837
%H:%M => 08:37
%H => 08
%H%M%S,%L => 083748,000
%T,%L => 08:37:48,000
%H%M%S.%L => 083748.000
%T.%L => 08:37:48.000
%H%M%S%z => 083748-0600
%T%:z => 08:37:48-06:00
%Y%m%dT%H%M%S%z => 20211119T083748-0600
%FT%T%:z => 2021-11-19T08:37:48-06:00
%Y%jT%H%M%S%z => 2021323T083748-0600
%Y-%jT%T%:z => 2021-323T08:37:48-06:00
%GW%V%uT%H%M%S%z => 2021W471T083748-0600
%G-W%V-%uT%T%:z => 2021-W47-1T08:37:48-06:00
%Y%m%dT%H%M => 20211119T0837
%FT%R => 2021-11-19T08:37
%Y%jT%H%MZ => 2021323T0837Z
%Y-%jT%RZ => 2021-323T08:37Z
%GW%V%uT%H%M%z => 2021W471T0837-0600
%G-W%V-%uT%R%:z => 2021-W47-1T08:37-06:00
关于strftime的长故事
程序员需要不断地在不同的日期和时间格式之间进行转换。世界上不同地区的人喜欢用不同的方式来显示日期,这对于许多不同的系统来说也是如此,它们要求日期以特定的格式来接受。适应不同的日期格式可能是一个相当大的痛苦。但它将不再是一个痛苦,因为在这篇文章之后,你将成为一个有能力在Ruby中轻松格式化日期/时间的向导。
Ruby默认以一种特定的方式来格式化Time 对象。但是你可能想要一些其他的东西,以适应你的情况。太好了!Ruby有一个专门用于这项工作的方法。strftime'(字符串格式化时间)方法可以得到你可能需要的任何格式。它是一个高度灵活的方法,有很多选项供你试验。你可以得到没有日期的时间,也可以得到一个带有年、日和当前月份名称的格式化的日期。
它的工作原理是通过传递一个带有格式指定器的字符串。这些指定符,更正式地称为指令,将被一个值所取代,因为它们指示该方法自定义生成人类可读的日期。如果你曾经使用过printf方法,那么这个想法与此非常相似。这里有几个例子。
time = Time.new
time.strftime("%d/%m/%Y") # "05/12/2015"
time.strftime("%I:%M %p") # "11:04 PM"
time.strftime("%d of %B, %Y") # "21 of December, 2015"
在深入研究strftime 方法之前,我们需要你快速复习一下Ruby中的Time 类,这样你就能充分准备好从本课中获得最多信息。
Time 的开始。
尽管strftime方法与所有与时间相关的类都有关,包括Date、Time和DateTime,但我们只需了解时间类就可以了。Ruby中的时间类表示日期和时间,存储为自1970年1月1日00:00 UTC以来的秒数。这个时间被称为 "Unix纪元",可以被认为是计算机的时间起点。它被用来抓取自那时起至2038年的当前时间、日期和年份。在Ruby中,一个时间实例同时拥有日期和时间。日期部分由日、月和年组成,而时间部分由小时、分钟和秒组成。
在Ruby中,你可以使用Time.new 或Time.now 得到当前的日期和时间,并将其赋值给一个变量。然后你可以通过以下方式获得年、月、日、时、分、秒等信息。
t = Time.now()
puts t.year()
# => 2022
puts t.month()
# => 1
puts t.day()
# => 7
puts t.hour()
# => 22
puts t.min()
# => 0
puts t.sec()
# => 46
那么,Ruby中的Time 实例本身是什么样子的。
t = Time.now()
puts t
# => 2022-01-08 13:35:53 +0000
正如你所看到的,这种格式在某些情况下可能是不太理想的。在给你提供strftime 方法的所有可能的指令组合之前,让我们先来看看现实世界的情况,我们想给我们的应用程序的前端发送一个格式很好的日期,代表一个客户的加入日期。让我们在下一节中学习如何做到这一点,在这一节中,我们将通过对strftime应用不同指令的思考过程来达到我们想要的结果。
strftime:应用和思考过程
如前所述,我们希望将时间实例所代表的数据,如2022-01-08 13:35:53 +0000 ,显示为Saturday, 08 Jan 2022 。后者似乎是一种更常见的格式,你会在网站上看到。那么我们如何获得它呢?首先,我们需要一周的全称,即 "星期日"。通过检查本课后面的小抄中的 "工作日 "部分,我们发现我们需要使用指定符%A 。
t = Time.new(2022,1,8,13,35,53)
puts t.strftime("%A")
# => Saturday
很酷吧?好吧,也许它看起来还没有那么酷。让我们来应用其余的指令。接下来,我想得到,08 ,如果是个位数,就用一个零来填充月份的日期。我只需添加另一条指令,%d ,就可以做到这一点。同样,对于Jan ,我们有%b ,对于2022 ,我们有%Y ,这是完整的数字年份。总的来说,就是这样。
t = Time.new(2022,1,8,13,35,53)
puts t.strftime("%A %d %b %Y")
# => Saturday 08 Jan 2022
现在日期的格式已经正确,但细心的读者可能已经注意到仍然缺少一些东西。是的,缺少 "逗号"。如果你找到了就给你打分。这里没有关于逗号或任何字符串的指令或指定,但不用担心。你提供的任何字符串,如果在文档中没有被列为指令,将被简单地输出到结果字符串中。将这些信息应用到上面的例子中,我们只需在我们的第一个指令后添加一个逗号,就可以了。
puts t.strftime("%A, %d %b %Y")
# => Saturday, 08 Jan 2022
完美!"。
你现在可以随心所欲地使用各种指令了。
深入研究
本节首先展示了strftime 方法的基础知识,然后包含了一个基本的小抄,你需要逐渐熟悉,最后通过一些很酷的例子把这个概念带回家。
strftime 方法需要一个具有以下结构和规则的指令。
结构 -%<flags><width><modifier><conversion>
规则。
-
指令以百分比(%)字符开始。
-
一个标志和转换指定器告诉方法如何显示时间和日期。
-
最小字段宽度指定了最小宽度。你可以忽略这一点。
-
修饰符是 "E "和 "O"。也可以忽略不计。
-
没有在指令中列出的常规文本将按照输出中的情况通过。
strftime小抄
标志
| 语法 | 说明 |
|---|---|
| - | 在数字输出上没有填充物 |
| _ | 用空格填充 |
| 0 | 用零填充 |
| 对结果字符串进行大写 | |
| : | 使用冒号表示%z |
日期 (年, 月, 日)
| 语法 | 说明 |
|---|---|
| %Y | 带世纪的年份 |
| %y | 年 % 100 (00...99) |
| %m | 年的月份,零填充 (01..12) |
| %B | 完整的月份名称("一月")。 |
| %b | 缩写的月份名称("Jan")。 |
| %d | 月的日期,零填充(01..31) |
| %j | 年的一天(001...366) |
时间(小时、分钟、秒)。
| 语法 | 说明 |
|---|---|
| %H | 一天中的小时,24小时时钟,零填充(00...23) |
| %k | 一天中的小时,24小时制时钟,空白填充 ( 0...23) |
| %I | 一天中的小时,12小时的时钟,零填充(01...12) |
| %l | 一天中的小时,12小时的时钟,空白填充 ( 1...12) |
| %P | 子午线指标,小写("am "或 "pm")。 |
| %p | 子午线指示器,大写("AM "或 "PM")。 |
| %M | 小时的分钟数(00...59) |
| %S | 分钟的秒数 (00...60) |
| %z | 时区与UTC的小时和分钟偏移(如+0900)。 |
平日。
| 语法 | 描述 |
|---|---|
| %A | 完整的工作日名称(例如:星期日)。 |
| %a | 缩写的工作日名称(如:Sun)。 |
| %u | 从星期一开始的一天(1...7)。 |
有用的组合。
| 语法 | 说明 |
|---|---|
| %c | 日期和时间 (%a %b %e %T %Y) |
| %D | 日期 (%m/%d/%y) |
| %F | ISO 8601日期格式 (%Y-%m-%d) |
| %r | 12小时时间 (%I:%M:%S %p) |
| %R | 24小时时间 (%H:%M) |
最后的话:随机的例子
初始化时间。
t = Time.new(2022,1,8,13,35,53)
你的约会时间。
puts t.strftime("%B, %Y at %-I:%M %p")
# => January, 2022 at 12:13 AM
闹钟: 闹钟。
puts t.strftime("%r")
# => 12:13:29 AM
Windows操作系统的日期。
puts t.strftime("%d/%m/%Y")
# => 09/01/2022
有趣的事实日期。
puts t.strftime("%-d %b is on a %A and is day number %j of the year %Y")
# => 8 Jan is on a Saturday and is day number 008 of the year 2022
基本上就是这样了。现在出去做一些看起来很独特的日期格式吧!