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)
使用%y
in时strptime
,代码假定 68 以下的值被视为 21 世纪,如下所述:
世纪内的年份 (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
Run Code Online (Sandbox Code Playgroud)
该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)
归档时间: |
|
查看次数: |
2412 次 |
最近记录: |