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 日にアルファベット混入。
	}


でわ。

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

  • 作者: Cay S. Horstmann
  • 出版社/メーカー: インプレス
  • 発売日: 2015/04/03
  • メディア: Kindle版
  • この商品を含むブログ (6件) を見る
Java8ではじめる「ラムダ式」 (I・O BOOKS)

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

  • 作者: 清水美樹
  • 出版社/メーカー: 工学社
  • 発売日: 2014/07/01
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る
Javaによる関数型プログラミング ―Java 8ラムダ式とStream

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

  • 作者: Venkat Subramaniam,株式会社プログラミングシステム社
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2014/10/24
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (3件) を見る
わかりすぎるJava8の教科書 (SCC Books 376)

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

  • 作者: 中島省吾
  • 出版社/メーカー: エスシーシー
  • 発売日: 2014/10/01
  • メディア: 単行本
  • この商品を含むブログを見る
現場で使える[最新]Java SE 7/8 速攻入門

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

  • 作者: 櫻庭祐一
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/11/19
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る