Ruby日期格式验证

4 ruby

我如何验证日期'2016-01-01'的格式是否正确(%Y-%m-%d).

例如,我想获得true或者false日期是否正确.

伪代码:

if ('2016-01-01' == (%Y-%m-%d))
    puts date is valid
else
    puts date is not valid
end
Run Code Online (Sandbox Code Playgroud)

请帮忙,

谢谢!

bun*_*ufi 7

由于没有严格指定问题的上下文,我将在 Rails 的上下文中添加一种可能的解决方案。我发现iso8601方法很有用,它会检查字符串是否是有效的 iso8601 日期,如果不是,则会引发异常。 http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-iso8601

def validate_date(date)
  Date.iso8601(date.to_s)
  return true
rescue ArgumentError
  false
  # although, in my case I felt that logging this error and raising exception was a better approach, since we are forwarding this to the user of our API.
  # log_and_raise_error("Given argument is not a valid ISO8601 date: '#{date}'")
end
Run Code Online (Sandbox Code Playgroud)


spi*_*ann 5

看起来您不仅对字符串的格式感兴趣,而且如果字符串表示有效日期(例如2016-01-32无效):

require 'date'

def validate_date(string)
  format_ok = string.match(/\d{4}-\d{2}-\d{2}/)
  parseable = Date.strptime(string, '%Y-%m-%d') rescue false

  if string == 'never' || format_ok && parseable
    puts "date is valid"
  else
    puts "date is not valid"
  end
end

validate_date('2016-01-01')
#=> "date is valid"

validate_date('2016-01-32')
#=> "date is not valid"

validate_date('01-01-2016')
#=> "date is not valid"

validate_date('never')
#=> "date is valid"

validate_date('today')
#=> "date is not valid"
Run Code Online (Sandbox Code Playgroud)

或者(将返回truefalse):

require 'date'

def valid_date?(string)
  return true if string == 'never'

  !!(string.match(/\d{4}-\d{2}-\d{2}/) && Date.strptime(string, '%Y-%m-%d'))
rescue ArgumentError
  false
end

valid_date?('2016-01-01')
#=> true

valid_date?('2016-01-32')
#=> false

valid_date?('01-01-2016')
#=> false

valid_date?('never')
#=> true

valid_date?('today')
#=> false
Run Code Online (Sandbox Code Playgroud)

注意:Date.strptime引发无效日期的异常,因此在这种情况下rescue false返回false.