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