为什么'Date.parse'没有为无效的日期字符串引发异常?

时间:2017-11-09 12:16:20

标签: ruby date

我尝试创建一个方法,如果字符串是有效日期,则返回转换为日期的给定字符串,否则返回字符串。这是代码:

def check_string(string)
  if date = (Date.parse(string) rescue nil)
    return date
  end
  string
end

当字符串是:

"Análise de Novos Métodos Genéticos"

Date.parse方法返回有效日期:

#<Date: 2017-11-01 ((2458059j,0s,0n),+0s,2299161j)>

而非提出异常。

2 个答案:

答案 0 :(得分:3)

确定任意字符串是否对应于有效日期非常复杂。如果可能,我会强烈建议您将应用程序限制为仅以更受限制的,明确定义的格式接受日期。

例如,您可以使用Date.strptime根据特定格式测试字符串。

为了理解这里发生的事情,我们可以构建一个 minimal 再现示例:

Date.parse "Análise de Novos Métodos Genéticos"
#=> #<Date: 2017-11-01 ((2458059j,0s,0n),+0s,2299161j)>

Date.parse "Nov"
#=> #<Date: 2017-11-01 ((2458059j,0s,0n),+0s,2299161j)>

图书馆正在将此特定字符串解释为“11月1日”,因为它包含"Nov"

答案 1 :(得分:2)

Per the documentation(强调我自己):

  

解析日期和时间的给定表示,并创建日期对象。 此方法不起验证器的作用。

因此,如果您要验证给定字符串实际上是一个日期,您必须通过其他方式(可能是Date.strptime)来实现。 Date.parse似乎认为您的特定输入字符串可以接受,因为它包含子字符串“Nov”(11月)。