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
パッケージが導入されている。
今後はそちらを利用する方が望ましいようだ。
スッキリわかるJava入門 第4版 スッキリわかるシリーズ
¥2,911 (2025年9月18日 00:01 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)JAVA TEA(ジャワティ) 大塚食品シンビーノストレート レッド 2L×6本
27% オフ内容量:2L×6本 カロリー:0kcal 原材料:紅茶 商品サイズ(高さ×奥行×幅):320mm×185mm×330mm
JAVA TEA(ジャワティ) 大塚食品シンビーノストレート レッド 無糖 茶 500ml×24本
14% オフ原材料、紅茶のみ。 無糖・カロリーゼロ いつもの食事に! 食事の味を引き立て食卓を華やかに彩るテーブルドリンク。 しっかりした味わいに軽やかな余韻