Как я могу убедиться, что дата «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

Пожалуйста помоги,

Благодарность!

3
user6801385 7 Сен 2016 в 14:39

3 ответа

Лучший ответ

Похоже, вас интересует не только формат строки, но и то, представляет ли строка действительную дату (например, 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"

Или (вернет true или false):

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

Примечание: Date.strptime вызывает исключение для недопустимых дат, поэтому rescue false возвращает false в таком случае.

5
spickermann 1 Июл 2018 в 10:39

Поскольку контекст вопроса не был строго определен, я добавлю одно возможное решение в контексте 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
6
bunufi 27 Ноя 2017 в 09:15
require 'date'

def date_valid?(date)
  format = '%Y-%m-%d'
  DateTime.strptime(date, format)
  true
rescue ArgumentError
  false
end

p date_valid?('2016-01-01') # true
p date_valid?('2016-25-10') # false
1
ShockwaveNN 7 Сен 2016 в 11:48