【Java】SimpleDateFormatの注意点

Java

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パッケージが導入されている。
今後はそちらを利用する方が望ましいようだ。

タイトルとURLをコピーしました