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)がカレンダー上に存在するかどうかをチェックします。

使用例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
}
}
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; } } }
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;
            }

      }
}

実行結果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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