Javaで日付型の変換などに使われる、
SimpleDateFormatについて何点か知らなかった仕様があったので、
注意点をメモしておく。
まずは下記ソース、
public class DateFormatExample {
public static void main(String[] args) throws Exception {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy/MM/dd");
String inputDateStr = "20220231";
Date date = inputFormat.parse(inputDateStr);
String outputDateStr = outputFormat.format(date);
System.out.println(outputDateStr);
}
}
日付文字列をyyyy/MM/ddに変換したい場合、
存在しない日付を変換する場合エラーとはならず、
予期せぬ日付に変換されてしまう。
この場合は、
sdf.setLenient(false);
を指定することで、厳密なチェックをしてくれる。
(この場合ParseExceptionが発生する。)
また以下の場合も見てみよう
public class DateValidationExample {
public static void main(String[] args) {
String dateFormatPattern = "yyyy/MM/dd";
SimpleDateFormat sdf = new SimpleDateFormat(dateFormatPattern);
sdf.setLenient(false); // 厳密な日付解析を有効にする
String inputDate = "2022/02/15ABCD"; // チェックしたい日付文字列
try {
// 日付を解析し、有効な場合は正しい日付として扱われます
sdf.parse(inputDate);
System.out.println(inputDate + " は有効な日付です。");
} catch (ParseException e) {
System.out.println(inputDate + " は無効な日付です。");
}
}
}
日付けの妥当性チェックをしているが、
存在しない日付なのに有効となってしまう。
末尾に余計な文字列があってもスルーされてしまうようだ。
ちなみにこちらの場合は、
sdf.setLenient(false);
を指定しても変わらない。
SimpleDateFormat
は古い日付フォーマットAPIであり、
Java 8以降では新しいjava.time
パッケージが導入されている。
今後はそちらを利用する方が望ましいようだ。