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标准决定世纪。
chronic
gem有一个类似的问题,因为它决定了世纪,虽然不同。
解决方案是调整日期:
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)的年份。
在chronic
gem中,顺便说一句,截止年份是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