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

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 

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

chronicgem有一个类似的问题,因为它决定了世纪,虽然不同。

解决方案是调整日期:

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

在这篇文章的评论中,Stefan提出了一个很好的一个class轮:

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

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

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

当在strptime使用%y时,代码假设在21世纪考虑了68以下的值,如下所示:

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

chronicgem中,顺便说一句,截止年份是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 

将Chronic gem添加到Gemfile中

gem 'chronic'

然后解析它:

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