Ruby 1.9.3和Ruby 1.8.7在日期字符串解析方面的差异

3

使用 Ruby 1.8.7 版本:

>> require 'time'
>> Time.parse '01/28/2012'
=> Sat Jan 28 00:00:00 +0200 2012
>> Time.parse '28/01/2012'
=> ArgumentError: argument out of range

使用 Ruby 1.9.3 版本:

>> require 'time'
>> Time.parse '28/01/2012'
=> 2012-01-28 00:00:00 +0200
>> Time.parse '01/28/2012'
=> ArgumentError: argument out of range

看起来在Ruby 1.8.7中它接受的是美国日期格式(月/日/年),而在Ruby 1.9.3中它仅接受非美国日期格式(日/月/年)。

有没有办法将此行为更改为像Ruby 1.8.7一样?

2个回答

7
您考虑使用Time.strptime("01/28/2012", "%m/%d/%Y")替换Time.parse吗?这样,您可以更好地控制Ruby如何解析日期。
如果不行,也有一些宝石(e.g. ruby-american_date )可让Ruby 1.9 Time.parse的行为与Ruby 1.8.7相似,但仅在绝对必要时使用。
1.9.3-p0 :002 > Time.parse '01/28/2012'
ArgumentError: argument out of range

1.9.3-p0 :003 > require 'american_date'
1.9.3-p0 :004 > Time.parse '01/28/2012'
 => 2012-01-28 00:00:00 +0000 

Ruby 只能猜测日期格式,而美国的格式由于含糊不清而令人恼火。01/02/03 到底是什么?YY/MM/DDDD/MM/YYMM/DD/YY - tadman
因为涉及的代码使用了Rails的String#to_time,它使用了Time.parse,所以我一直在寻找改变Time.parse工作方式的解决方案。如果这不是现有的代码,我肯定会使用Time.strptime——更加健壮。感谢您指出ruby-american_date gem! - arikfr

0

Ruby 1.9.3似乎已经改变了默认的日期解析格式...

在Ruby 1.8.7中

"11/14/2012".to_time
==> Wed Nov 14 00:00:00 UTC 2012

在 Ruby 1.9.3 中

"11/14/2012".to_time
ArgumentError: invalid date

现在的 to_time 转换接受 %d,%m,%Y 作为字符串格式...

在 Ruby 1.9.3 中

"14/11/2012".to_time
2012-11-14 00:00:00 UTC

注意输出的不同格式。在1.9.3中,Time.now.to_s也返回了不同的格式。要小心!

我看到另一篇帖子说to_time在Ruby 1.9.3中被故意弃用了,但似乎只是解析格式发生了变化。

此外...

在1.8.7中

Time.parse("11/14/2012", "%m,%d,%Y")
==> Wed Nov 14 06:00:00 UTC 2012

在1.9.3中

Time.parse("11/13/2012", "%m,%d,%Y")
==> ArgumentError: argument out of range

Time.strptime在1.8.7中不存在,只存在于1.9.3中,因此在进行必要的更改以适应1.9.3后,我不知道如何使我的代码向后兼容到1.8.7。


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