检查日期格式是否为2013-11-29或29-11-2013格式

时间:2013-11-29 14:13:47

标签: ruby-on-rails ruby ruby-on-rails-3

在我的控制器中,我有这样的陈述:

@termine = @current_department.termins.where(date: Date.strptime(params[:date], '%d-%m-%Y')).to_json

我将日期29-11-2013转换为2013-11-29

Date.strptime(params[:date], '%d-%m-%Y'))

然后我尝试将2013-11-29作为params[:date]传递,但我收到错误:

invalid date

如何查看日期的格式?

4 个答案:

答案 0 :(得分:2)

假设您不会在公元100年之前处理多年,您只需检查字符串的第二个和第三个字符是否都是数字。

这足以区分这两种格式。您必须检查第二个和第三个字符,以防日期可能是一个数字,但如果它们都是数字(不是-),则必须是YYYY-*变体。

答案 1 :(得分:1)

使用begin .. rescue ..

date_str = '2013-11-29'
begin
  d = Date.strptime(date_str, '%d-%m-%Y')
rescue ArgumentError
  d = Date.strptime(date_str, '%Y-%m-%d')
end
d # => #<Date: 2013-11-29 ((2456626j,0s,0n),+0s,2299161j)>

答案 2 :(得分:1)

您还可以使用正则表达式模式。

(\d{4})-(\d{2})-(\d{2})会给你YYYY-MM-DD

(\d{2})-(\d{2})-(\d{4})会给你DD-MM-YYYY

编辑:应该注意,这将捕获DD和MM,无论顺序如何,所以你要验证组是&gt;或者&lt; 12。

答案 3 :(得分:0)

您显然正在尝试匹配数据库的日期格式。你不需要。

取出strptime,只需在Rails上以任何格式抛出日期,Time.parse将在内部弄明白。