我有一些字符串可能是也可能不是日期:
"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的好方法的任何建议吗?
答案 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