检查ruby中的日期格式

时间:2016-01-29 10:17:10

标签: ruby ruby-on-rails-3.2

我的字符串为:“12-22-2015”。它采用MM-DD-YYYY格式。如何检查是否有两个“ - ”以及它是否为MM-DD-YYYY格式。

基本上我需要检查是否存在双重 - 然后使用

Message.includes(:user)
       .select('messages.*, users.name')
       .where("messages.created_at::date = ?" , Date.strptime(@query, "%m-%d-%Y"))
       .paginate(:page => params[:page], :per_page => 5)

查询否则使用

Message.includes(:user)
       .select('messages.*, users.name')
       .where("users.name ilike ? OR messages.to ilike ?" ,"%#{@query}%", "%#{@query}%")
       .paginate(:page => params[:page], :per_page => 5)

我添加了

Message.includes(:user).select('messages.*, users.name')
       .where(
         "users.name ilike ? OR messages.to ilike ? OR messages.created_at::date = ?",
         "%#{@query}%",
         "%#{@query}%",
         Date.strptime(@query, "%m-%d-%Y")
       )
       .paginate(:page => params[:page], :per_page => 5)

查询但如果ArgumentError: invalid date不是日期,则会收到错误@query

2 个答案:

答案 0 :(得分:2)

没有任何方法可以确定您的字符串是否为MM-DD-YYYY格式。我的意思是,01-02-2016 可能是1月的第二个。但它可能是2月的第一天(对于美国以外的任何地方,可能是)。

您当然可以通过以下方式检查它是否是有效日期:

begin
    date = Date.strptime(@query, "%m-%d-%Y")
    #code using date goes here
rescue ArgumentError
    #code dealing with an invalid date goes here
end

甚至:

date = Date.strptime(@query, "%m-%d-%Y") rescue nil
# date is now nil if @query wasn't a valid date

......这比什么都没有好,但是它没有抓住DD-MM-YYYY和MM-DD-YYYY之间的区别,当然也就是看起来像真正的日期不正确的日期。

答案 1 :(得分:-1)

冒着明显陈述的风险:检查之前的日期,然后将其添加到您的查询中。

class Message < ActiveRecord::Base
  DATE_FORMAT = "%m-%d-%Y" # Somewhere at the top of your class

  scope :search, lambda do |query|
    # Construct the base conditions and variable bindings
    conditions = "user.name ILIKE :query_for_like OR messages.to ILIKE :query_for_like"
    bindings = { query_for_like: "%#{query}" }

    # Try to parse the value as a date; get `nil` otherwise
    date_query = Date.strptime(query, DATE_FORMAT) rescue nil

    # If it's a valid date, add the date condition and binding to your arguments
    if date_query
      conditions = "#{conditions} OR messages.created_at::date = :date_query"
      bindings[:date_query] = date_query
    end

    includes(:user)
      .select('messages.*, users.name')
      .where(conditions, bindings)
  end

  # ...
end

然后:

@messages = Message.search(@query).paginate(...)