发现 Ruby 格式化日期有点奇怪, 1/Jan/2022:00:00:00 会格式化成 2021 年 1 月 1 日

2021-12-31 11:38:03 +08:00
 justest123
irb(main):019:0> require "date"
=> true
irb(main):020:0> Date.new(2022,1,1).to_s
=> "2022-01-01"
irb(main):021:0> Date.parse("2022-01-01").to_s
=> "2022-01-01"
irb(main):022:0> Date.parse("1st Jan 2022").to_s
=> "2022-01-01"
irb(main):023:0> Date.parse("1/Jan/2022:00:00:00 +0800").to_s
=> "2021-01-01"
irb(main):024:0> Date.parse("1/Jan/2022").to_s
=> "2022-01-01"
irb(main):025:0> Date.parse("1/Jan/2022:00:00:00").to_s
=> "2021-01-01"

偶然发现的现象,Nginx 日志里的这种格式的时间,带上时间或时间+时区后反而格式化错了,而 Date 支持的其他格式都没有问题,简单搜索一下没搜到是什么原因

1662 次点击
所在节点    程序员
5 条回复
alfredhot
2021-12-31 12:31:26 +08:00
没什么, 就是 ruby 不支持这个时间格式而已.
你可以把日期和时间中间的 ':' 换成 'T'
或者也可以用 strptime 转义
如下:

2.7.3 :001 > require 'date'
=> true
2.7.3 :002 > Date.parse("1/Jan/2022:00:00:00").to_s
=> "2021-01-01"
2.7.3 :003 > Date.parse("1/Jan/2022T00:00:00").to_s
=> "2022-01-01"
2.7.3 :004 > Date.strptime("1/Jan/2022:00:00:00", '%d/%b/%Y:%H:%M:%S').to_s
=> "2022-01-01"
justest123
2021-12-31 13:13:06 +08:00
@alfredhot 我测试发现这种格式的时间,只有在今天之后的才会格式化出错,之前的都正常可以解析哎
lululau
2021-12-31 13:58:47 +08:00
看文档啊~年轻人~~
之前的都正常可以解析,你实际试了吗,Date.parse("1/Jan/2000:00:00:00") 可以正常解析吗
justest123
2021-12-31 14:06:01 +08:00
@alfredhot
@lululau
多谢两位大佬教导,学习了
alfredhot
2022-01-01 19:19:50 +08:00
@justest123 #2
看来 Date.parse 会将解析不出来的年份用现在的年份填充,
所以 Date.parse("1/Jan/2021:00:00:00 +0800") 在去年会被解析成正确的日期.
纯属误打误撞哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX