山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

Java8 での日付妥当性チェック

Java8 の LocalDate と DateTimeFormatter を使用した日付妥当性チェックについてです。

2014 年に公開された Java8 を使用した日付妥当性チェックですが、すでに多くのサイトでサンプルが掲載されています。ただ、少し気になる実装も紹介されており、自分なりの正しい日付チェック方法を残しておきます。

	public static boolean isCorrectDate(String dateStr) {
		if (dateStr == null || dateStr.length() != 10) {
			return false;
		}
		DateTimeFormatter df = DateTimeFormatter.ofPattern("uuuu/MM/dd").withResolverStyle(ResolverStyle.STRICT);
		try {
			LocalDate.parse(dateStr, df);
		} catch (DateTimeParseException e) {
			return false;
		}
		return true;
	}

最初に引数の null チェックと 10 文字であるかどうかのチェックを行います。10 文字であるかどうかのチェックを行わない場合、「-99999/01/01」が妥当な日付と判断されてしまいます(「99999/01/01」は期待通りに、正しくない日付と判断します。不思議。。。)。マイナスの年を妥当な日付と判断することが要件に添っている状況は稀だと思うので、マイナスは問答無用で正しくない日付と判断してしまいます。

使用例を以下に示します。

	public static void main(String... args) {
		System.out.println(isCorrectDate("0000/01/01"));  // true
		System.out.println(isCorrectDate("9999/12/31"));  // true
		System.out.println(isCorrectDate("2017/02/28"));  // true
		System.out.println(isCorrectDate("2017/02/29"));  // false  うるう年でないので 2/29 は存在しない。
		System.out.println(isCorrectDate("2020/02/28"));  // true
		System.out.println(isCorrectDate("2020/02/29"));  // true 2020 年はうるう年。東京オリンピックの年。
		System.out.println(isCorrectDate("02020/02/29")); // false 年が 5 桁。
		System.out.println(isCorrectDate("2020/2/29"));   // false 月が 1 桁。
		System.out.println(isCorrectDate("2020/02/1"));   // false 日が 1 桁。
		System.out.println(isCorrectDate("202a/02/01"));  // false 年にアルファベット混入。
		System.out.println(isCorrectDate("2020/0a/01"));  // false 月にアルファベット混入。
		System.out.println(isCorrectDate("2020/01/0a"));  // false 日にアルファベット混入。
	}


でわ。

Java8ではじめる「ラムダ式」 (I・O BOOKS)

Java8ではじめる「ラムダ式」 (I・O BOOKS)

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

わかりすぎるJava8の教科書 (SCC Books 376)

わかりすぎるJava8の教科書 (SCC Books 376)

現場で使える[最新]Java SE 7/8 速攻入門

現場で使える[最新]Java SE 7/8 速攻入門