Ruby strftime:没有前导零的日期,%e无法工作

11

我想格式化一个日期,使得日期中的天数没有前导零

使用 %d 可以成功格式化,但带有前导零。

date_time.strftime("%d/%m/%y")
result: 04/01/11 

我在谷歌上搜索并发现应该使用%e而不是%d,但是执行以下操作会给我一个空字符串。

date_time.strftime("%e/%m/%y")
result: 

这是否与 Ruby 的版本有关?我正在使用 Windows 机器上的 v1.8.7 版本。 更重要的是,有没有其他方法可以实现没有前导零的日期(比 gsub 更方便)?

6个回答

33

如果您想删除月份或日期前导零,只需在格式前面加上负号,像这样:

Date.parse("2014/06/06").strftime("%Y/%-d/%-m")

1
谢谢你 :) 顺便问一下,你在哪里找到这些有用的信息的? - developer033
很久没有看过我的备注了,非常长的一段时间。但是关于我如何知道这个问题,它适用于UNIX日期命令。"date '+%-Y.%-m.%-d.%-H.%-M.%-S'" - Colin MacKenzie - III

9
作为一个选项:
date_time.strftime("#{date_time.day}/%m/%y")

3

之前我在Windows上使用strftime时遇到过问题,因为它不支持和Unix完全相同的代码。

同时,我在Mac OS X上运行了以下代码:

> date_time.strftime("%e/%m/%y")
" 3/03/11" 

正如您所看到的,零所在的位置有一个空格。在调用strftime之后,仍需要处理字符串。

我建议,在这种情况下使用最安全的方法,即使用%d,并对其进行gsub / trim调用。


2

不幸的是,%e 仍然会在 0 的位置留下一个空格。如果您不想要这个空格,可以像这样删除前导的 0。

> date_time.strftime("%d/%m/%y").gsub(/^0/, '')
"7/12/12"

1

试一下这个

date_time.strftime("%d/%m/%y").gsub(/ 0(\d\D)/, ' \1')

0\1 前面的空格是错误的。此外,这似乎是一种过于原始和粗暴的解决方案。 - Mark Huk

0

可以使用“-”标志来去掉填充。源代码

例子:

irb(main):002:0> Time.current.strftime("%-e %b %Y") 
=> "1 Jun 2022" 
irb(main):003:0> Time.current.strftime("%e %b %Y") 
=> " 1 Jun 2022"
irb(main):004:0> Time.current.strftime("%d %b %Y")
=> "01 Jun 2022"
irb(main):005:0> Time.current.strftime("%-d %b %Y")
=> "1 Jun 2022"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接