用多种接受格式验证Ruby中的日期字符串?

时间:2013-11-20 19:46:23

标签: ruby-on-rails ruby parsing date

我有一些字符串可能是也可能不是日期:

"Hello World", "Sept 12, 2013", "Hello World Sept 12"

在这种情况下,我只想将第二个视为正确的日期。

到目前为止,我一直在使用Date.parse和慢性宝石,但它们非常宽松,可以将"a a""12-UNKN/34/OWN1"等字符串转换为可接受的日期。

例如:

Date.parse '12-UNKN/34/OWN1'

将返回:

 Tue, 12 Nov 2013

所以,我试图将接受的格式限制为一组我可以控制的格式:

09/12/2013
9/12/2013
9/12/13
09-12-2013
9-12-2013
9-12-13

和一些文本内部的格式如:

Sept 9, 2013 - with or without the coma, accepting Sep, Sept or September and with or without a dot after the month name, covering things like:
Sept. 9, 2013
Sept 09, 2013
Sept. 09, 2013
September 9, 2013
September 09, 2013

有关在Ruby中使用纯Ruby或使用Rails的好方法的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我会抓住这个并详细说明我的评论。将日期与其他字符串分开可让您在将日期交给Chronic之前以多种格式验证日期:

validates_format_of :date, with: /\d{2,4}[-/]\d{1,2}[-/]\d{1,4}/, on: :create

这应该处理您描述的大部分日期格式。

然而,一个大问题是你不知道是否有人提交美国格式或非美国格式的日期。

更大的问题是知道标题字符串的哪一部分实际上是一个日期,这可能是一个更复杂的正则表达式,或者让自己变得容易并使它成为一个单独的字段。你试图解析自然语言有点接近,这种语言无论如何都不会被削减和干燥。

答案 1 :(得分:0)

尝试这样的事情

validate :validate_some_date

private

def validate_some_date
  errors.add("Created at date", "is invalid.") unless [
      date_case_one,
      date_case_two,
      date_case_three
    ].all?
end

def date_case_one
  # some regex
end

def date_case_two
  # some regex
end

def date_case_three
  # some regex
end