Ruby错误地解析了2位数年份

时间:2014-11-21 09:29:45

标签: ruby ruby-on-rails-3

Ruby正确解析第一个日期,但第二个日期不正确。用ruby 1.9.3和2.1.2测试。

知道如何让它始终如一地运作吗? (我们的出生日期为2位数年)

Date.strptime("10/11/89","%d/%m/%y")
=> Fri, 10 Nov 1989

Date.strptime("15/10/63","%d/%m/%y")
=> Mon, 15 Oct 2063

4 个答案:

答案 0 :(得分:4)

strptime方法将文本“63”解析为2063年,而不是1963年。
这是因为该方法使用POSIX standard确定世纪。

chronic宝石有一个类似的问题,因为它决定了世纪,但不同。

解决方案是调整日期:

d = Date.strptime("15/10/63","%d/%m/%y")
if d > Date.today
  d = Date.new(d.year - 100, d.month, d.mday)
end

在这篇文章的评论中,斯特凡提出了一个很好的一句话:

d = d.prev_year(100) if d > Date.today 

如果您需要速度,可以尝试这样优化:

d <= Date.today || d = d << 1200

答案 1 :(得分:4)

%y中使用strptime时,代码假定在21世纪考虑68以下的值,如图所示here

  

世纪之内(0-99)。如果未指定世纪(%C的值),则69-99范围内的值是指二十世纪(1969-1999)的年份; 00-68范围内的数值是指二十一世纪(2000-2068)的年份。

chronic宝石中,顺便说一句,截止年份是64:

Chronic.parse('15/10/64')
# => 1964-10-15 12:00:00 +0200

Chronic.parse('15/10/63')
# => 2063-10-15 12:00:00 +0300

答案 2 :(得分:0)

Chronic gem新增了扩展支持,可以使用ambiguous_year_future_bias选项解析两位数的年份:

irb(main):029:0> Chronic.parse('15/10/99', ambiguous_year_future_bias: 10)
=> 2099-10-15 12:00:00 +0300
irb(main):030:0> Chronic.parse('15/10/99', ambiguous_year_future_bias: 50)
=> 1999-10-15 12:00:00 +0300

答案 3 :(得分:-1)

将Chronic gem添加到您的Gemfile

gem 'chronic'

然后解析它:

Chronic.parse("15/10/68")
=> 1968-10-15 12:00:00 -0700