My開発メモ

DateTimeFormatterで日付チェック

java.timeパッケージで日付チェックをおこなってみた。

package test;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;

public class Test {
  static final String PATTERN = "yyyy/MM/dd";     // <== パターン

  public static void main(String[] args) {
    String text = "1999/09/09";                   //  <== 入力文字列
    if (isDate(text)) {
      System.out.println("正しい日付です。");
    } else {
      System.out.println("不正な日付です。");
    }
  }

  public static boolean isDate(String dateText) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern(PATTERN).withResolverStyle(ResolverStyle.STRICT);
    try {
      LocalDate.parse(dateText, fmt);
      return true;
    } catch (DateTimeParseException e) {
      return false;
    }
  }
}

このコードを実行すると、

不正な日付です。

と出力される。

「正しい日付です」と出力するためには、パターン文字列を

"G yyyy/MM/dd"

と、先頭に “G ” をつけて

String text = "西暦 1999/09/09";

と入力しなくてはならない。

これは、

.withResolverStyle(ResolverStyle.STRICT)

と、厳格モードを指定しているためである。

この指定をなくすと、”1999/09/09″ でも「正しい日付です」と出力される。

しかし、厳格モードにしておかないと、

"1999/09/31"

でも、「正しい日付です。」と出力されてしまう。

結論

厳格モードで日付チェックをするためには、パターン文字列を

"uuuu/MM/dd"

と、指定しなくてはならない。

package test;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;

public class Test {
  static final String PATTERN = "uuuu/MM/dd";     // <== パターン

  public static void main(String[] args) {
    String text = "1999/09/09";                   //  <== 入力文字列
    if (isDate(text)) {
      System.out.println("正しい日付です。");
    } else {
      System.out.println("不正な日付です。");
    }
  }

  public static boolean isDate(String dateText) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern(PATTERN).withResolverStyle(ResolverStyle.STRICT);
    try {
      LocalDate.parse(dateText, fmt);
      return true;
    } catch (DateTimeParseException e) {
      return false;
    }
  }
}

これだと、「正しい日付です」と出力される。

また、入力文字列を “1999/09/31” とすると、「不正な日付です」と出力してくれる。

カテゴリー: Java, memo

タグ: DateTimeFormatter, java.timeパッケージ, LocalDate

カウント: 213