読者です 読者をやめる 読者になる 読者になる

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

SimpleDateFormatの厳密な・・・

java

2013年には2月29日がありませんが、SimpleDateFormatで厳密な解析を
行わない場合、2013年3月1日と解釈してくれます。

public class DateSample {
    public static void main(String[] args) {
        DateFormat dt = new SimpleDateFormat("yyyyMMdd");
        try {
            System.out.println(dt.parseObject("20130229"));
        } catch (ParseException e) {
            System.out.println("Date型に変換できません!!");
        }
    }
}

実行結果

Fri Mar 01 00:00:00 JST 2013


日付や時刻を厳密にチェックするには、setLenientメソッドにfalseを渡してあげます。(デフォルトはtrueです。)
「厳密にチェック」とは、存在しない日付を指定された場合、Exceptionを発生させることです。

public class DateSample {
    public static void main(String[] args) {
        DateFormat dt = new SimpleDateFormat("yyyyMMdd");
        dt.setLenient(false);  // ← ここを追加
        try {
            System.out.println(dt.parseObject("20130229"));
        } catch (ParseException e) {
            System.out.println("Date型に変換できません!!");
        }
    }
}

実行結果

Date型に変換できません!!

ユーザが入力した日付の妥当性チェックを行うときなどに気をつけましょう。


余談ですが、JavaDocの「setLenient」を見ると「日付/時刻解析を厳密に行うかどうかを設定します。」と書いてあるので、厳密にチェックしたい場合trueをセットしてしまいそうですが、
「Lenient」の意味は「寛大な」ですから「日付/時刻解析を寛大に行うかどうかを設定します。」と、脳内変換してあげましょう。

即戦力にならないといけない人のためのJava入門(Java 8対応) エンタープライズシステム開発ファーストステップガイド (CodeZine BOOKS)

即戦力にならないといけない人のためのJava入門(Java 8対応) エンタープライズシステム開発ファーストステップガイド (CodeZine BOOKS)

やさしいJava 第5版 (「やさしい」シリーズ)

やさしいJava 第5版 (「やさしい」シリーズ)