Java8 DateFormatクラスのsetLenientメソッドで日付の存在チェックを行うサンプル

環境
JavaSE 1.8
Eclipse 4.14.0

構文
public void setLenient(boolean lenient)
日時解析を厳密に行うかどうかを設定します。厳密でない解析では、解析機能は、ヒューリスティックな方法を使って、
このオブジェクトのフォーマットと完全には一致しない入力を解釈することがあります
java.text.DateFormatクラスのsetLenient()にfalseを指定すると、日付解析を厳密に行うことができます。
指定した日付文字列(yyyy/MM/dd or yyyy-MM-dd)がカレンダー上に存在するかどうかをチェックします。

使用例

package com.arkgame.study;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;

public class ArkgDemo {

      // 日付の長さ10
      protected static final int DATE_LEN = 10;
      // ハイフン
      protected static final char HYPHEN = '-';
      // スラッシュ
      protected static final char SLASH = '/';

      public static void main(String[] args) {
            String strA = "2022/03/31";
            String strB = "2022/ab/21";
            String strC = "2022-11-07";

            boolean resA, resB, resC;
            //日付のチェック関数を呼び出す
            resA = checkDateFmt(strA);
            resB = checkDateFmt(strB);
            resC = checkDateFmt(strC);
            System.out.println("文字列Aのチェック結果: " + resA);
            System.out.println("文字列Bのチェック結果: " + resB);
            System.out.println("文字列Cのチェック結果: " + resC);

      }
      
      /**
       * 日付の妥当性チェック
       * 
       * @param target チェック対象の文字列
       * 
       * @return 日付存在する場合true
       */
      public static boolean checkDateFmt(String target) {
            if (target == null || target.length() != DATE_LEN) {
                  throw new IllegalArgumentException("引数の文字列は不正です");
            }
            
            // ハイフンをスラッシュに置換
            target = target.replace(HYPHEN, SLASH);
            DateFormat df = DateFormat.getDateInstance();
            
            //日時解析を厳密に行うかどうかを設定する
            df.setLenient(false);
            Date dt;

            try {
                  dt = df.parse(target);
                  System.out.println(dt);
                  return true;
            } catch (ParseException e) {
                  e.printStackTrace();
                  return false;
            }

      }
}

実行結果

Thu Mar 31 00:00:00 JST 2022
java.text.ParseException: Unparseable date: "2022/ab/21"
      at java.text.DateFormat.parse(DateFormat.java:366)
      at com.arkgame.study.ArkgDemo.checkDateFmt(ArkgDemo.java:53)
      at com.arkgame.study.ArkgDemo.main(ArkgDemo.java:24)
Mon Nov 07 00:00:00 JST 2022
文字列Aのチェック結果: true
文字列Bのチェック結果: false
文字列Cのチェック結果: true

 

Java

Posted by arkgame