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 が必要です。