关于ruby的strftime介绍

205 阅读9分钟

给不耐烦的人的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.newTime.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>

规则。

  1. 指令以百分比(%)字符开始。

  2. 一个标志和转换指定器告诉方法如何显示时间和日期。

  3. 最小字段宽度指定了最小宽度。你可以忽略这一点。

  4. 修饰符是 "E "和 "O"。也可以忽略不计。

  5. 没有在指令中列出的常规文本将按照输出中的情况通过。

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)
%FISO 8601日期格式 (%Y-%m-%d)
%r12小时时间 (%I:%M:%S %p)
%R24小时时间 (%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

基本上就是这样了。现在出去做一些看起来很独特的日期格式吧!