Rubyで、渡ってきた文字列が正当なdateである場合だけtrueを返し、その他の場合はfalseを返すvalidatorを作りました。
Ruby on Railsなどで活用できると思われます。というかRailsで使うために作りました。
gemとかがオーバーキルっぽい時に。
require 'date'
# 日付のvalidationを行う関数
# strに不正な文字列や文字列以外が渡ってきた場合rescueが動き、
# 不正な日付(2016-2-31など)が渡ってきた場合
# Date.valid_date?でfalseが返る
private def date_valid?(str)
begin
y, m, d = str.split("-").map(&:to_i)
return Date.valid_date?(y, m, d)
rescue
return false
end
end
追記
コメント欄でのご指摘を受け、次のようなコードにしてみました。
require 'date'
private def date_valid?(str)
!! Date.parse(str) rescue false
end
こうすることで、様々な日付フォーマットを受け入れられるようになりました。
また、trueオブジェクトに!!をかけることで、trueが返ってくるのも勉強になりました。
ありがとうございます。
!! object #=> true_objectの場合true、false_objectの場合falseになる仕組み
まず、! objectが評価され、objectをtrueかfalseに変換してしまいます。
今回返ってくることが期待されているDateオブジェクトはtrueオブジェクトなので、ここでfalseが返り、そして更に!をかけることでtrueが返るようになります。
もし、期待されていないNilオブジェクトが返ってきた場合、Nilオブジェクトはfalseオブジェクトなのでtrueが返り、更に!をかけるとfalseになります。