Java
Android
アプリ
バリデーション

【Android】日付入力のバリデーションをつくる!

日付入力のバリデーション


ユーザーが生年月日の入力や、予約日の入力をした際に不正な入力値を無効にしたい、エラーダイアログを出したいときがあると思います。
そんな時に使用するバリデーションの実装についてまとめてみました!

・↓「年」のバリデーション実装についてはこちら↓
【Android】無効な「年」をはじくバリデーションを実装するには??

実装コード

ValidationUtil.java
    /**
     * 有効な日付であるかのチェック
     * 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を返すようにしています。