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