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
答案 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