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;
}
}
}
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; } } }
実行結果
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