#日付入力のバリデーション
ユーザーが生年月日の入力や、予約日の入力をした際に不正な入力値を無効にしたい、エラーダイアログを出したいときがあると思います。
そんな時に使用するバリデーションの実装についてまとめてみました!
・↓「年」のバリデーション実装についてはこちら↓
【Android】無効な「年」をはじくバリデーションを実装するには??
##実装コード
/**
* 有効な日付であるかのチェック
* 13月や32日といった日にちは無効とする
*
* @param inputBirthDateString
* @return
*/
public static Boolean dateValidation(String inputDateString){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
// ポイント1
dateFormat.setLenient(false);
Date parsedDate = null;
try {
// ポイント2
parsedDate = dateFormat.parse(inputDateString);
} catch (ParseException e) {
e.printStackTrace();
return false;
}
// ポイント3
return dateFormat.format(parsedDate).equals(inputDateString);
}
###ポイント1
Lenient:
寛大な、慈悲深い、情け深い、(…に)寛大で、大目に見る、甘い
→ setLenient(false) は寛大さをなくす = 厳密なチェックをすることを意味します。
デフォルトでは true になっており、この設定だと、実在しない日付は自動的に繰り上げ・繰り下げが行われます。(例: 1月32日 → 2月1日)
###ポイント2
String 型を SimpleDateFormat を用いて Data型に変換します。
正常な日付の場合はパースが成功。無効な日付の場合はfalseを返します。
###ポイント3
ポイント2までの処理で問題なさそうですが、このままでは1つ問題があります。
それは SimpleDateFormatが前方一致で処理を行うからです。
→ 例: SimpleDateFormatのインスタンスを ”yyyy/MM/dd” の日付形式で作成したき、"2017/12/1A”という値がformatでき、”2017年12月1日”として扱われてしまいます。
→ なので、最後に「バリデーション対象となる文字列」と「SimpleDateFormatで変換したあとの文字列」を比較し、 例えば 2017/12/1Aが入力されていた場合はfalseを返すようにしています。