Techioz Blog

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

助けてください、

ありがとう!

解決策

文字列の形式だけでなく、文字列が有効な日付を表すかどうかにも興味があるようです (たとえば、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 は無効な日付に対して例外を発生させるため、そのような場合に false を返すにはレスキュー false が必要です。