日付形式の文字列のDate型への変換

一般的な日付の変換

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
try {
    sdf.parse("2015/05/31");
}
catch (ParseException e1) {
    e1.printStackTrace();
}


しかし、SimpleDateFormatを使った変換には2つの問題が存在します。


★問題1 日付形式の文字列の最後に不正な文字が付いている場合

try {
    Date date = sdf.parse("2015/05/31あ");
    System.out.println(sdf.format(date));
}
catch (ParseException e1) {
    e1.printStackTrace();
}

【実行結果】


この様に、日付の文字列に「あ」が含まれているにも関わらず正常に変換されてしまいます。
SimpleDateFormatのparseは、先頭部分が指定したパターン通りになっていたら、
先頭部分だけでparseを行います。
後ろに余計な文字が付いていても無視します。


★問題2 存在しない日付が指定されている場合

try {
    Date date = sdf.parse("2015/05/32");
    System.out.println(sdf.format(date));
}
catch (ParseException e1) {
    e1.printStackTrace();
}

【実行結果】


こちらも正常に変換されてしまいます。
5月の最終日から超えている日数分を勝手に進めた日付で変換してくれます。
個人的意見としては、ありがた迷惑です。


これらの問題を解決してくれる日付変換機能が
Apache commonsに含まれているDateUtilsparseDateStrictlyです。
日付のparseをStrictly(厳密)に行ってくれます。

try {
    DateUtils.parseDateStrictly("2015/05/31あ", "yyyy/MM/dd");
}
catch (ParseException e1) {
    e1.printStackTrace();
}

【実行結果】



try {
    DateUtils.parseDateStrictly("2015/05/32", "yyyy/MM/dd");
}
catch (ParseException e1) {
    e1.printStackTrace();
}

【実行結果】



外部から受け取った日付形式の文字列を、厳密簡単にチェックを行いたい場合は、
DateUtilsparseDateStrictlyの使用を検討してみてはどうでしょうか。

戻る