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

and*_*ape 8 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
Run Code Online (Sandbox Code Playgroud)

Uri*_*ssi 5

使用%yin时strptime,代码假定 68 以下的值被视为 21 世纪,如下所述

世纪内的年份 (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
Run Code Online (Sandbox Code Playgroud)

  • 慢性默认使用 50 年偏移,2014 - 50 = 1964 (2认同)

joe*_*son 4

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

宝石也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
Run Code Online (Sandbox Code Playgroud)

在这篇文章的评论中,Stefan 推荐了一个很好的衬里:

d = d.prev_year(100) if d > Date.today 
Run Code Online (Sandbox Code Playgroud)

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

d <= Date.today || d = d << 1200
Run Code Online (Sandbox Code Playgroud)

  • @stefan 为什么出生日期是未来的? (2认同)