厳密な日付の判定

入力された日付情報を 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日連続で方々から質問されたので、メモっときます。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/477