入力された日付情報を String 型で受け取って、Date 型なり Timestamp 型に変換するというのは、よくある話。そして、入力された日付の妥当性を検証するというのも、よくある話。
そんなときは、 Calendar クラスや DateFormat クラスの setLenient メソッドを使えば、らくちんOK。
例えば年月日のフィールドが分かれているケースでは、Calendar クラスを使って次のように妥当性検証ができる。
String year = 2008;
String month = 2;
String day = 30;
try {
Calendar c = Calendar.getInstance();
c.setLenient(false);
c.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day));
c.getTime();
} catch (IllegalArgumentException e) {
// 不正な日付の場合の処理
}
年月日を1フィールドに入力させるケースでは、DateFormat がらくちん。
String date = 2008/2/30
try {
DateFormat formatter = new SimpleDateFormat("yyyy/M/d");
formatter.setLenient(false);
formatter.parse(date);
} catch (ParseException e) {
// 不正な日付の場合の処理
}
setLenient(false) にしないと、例えば 2008/2/30 という日付でも例外をスローせず、勝手に 2008/3/1 と解釈してそのまま次の処理を行ってしまう。余計なお世話な気もする。
この話は Java の FAQ のような気がするんだけど、2日連続で方々から質問されたので、メモっときます。