1

「MM/dd/yyyy hh:mm a」を使用して SimpleDateFormat.setLenient オプションを初期化しています false に設定されています。以下にいくつかのユースケースを示します

1) 入力文字列:-01/02/2001 3:09 AM 予想:-合格すべき 実際:-合格

2) 入力文字列:-01/02/20016 3:09 AM 予想:-実際には渡さないでください:-passes 20016 が有効なものとして解析される理由がわかりません!!!!!

4

3 に答える 3

6

次のJavadocにあると思いますSimpleDateFormat

Year : 書式設定のために、パターン文字の数が 2 の場合、年は 2 桁に切り捨てられます。それ以外の場合は、数値として解釈されます。

したがって、基本的には 2 に制限できますが、それ以外の場合は int です。したがって、4-y は正確に 4 という意味ではなく、単に「2 ではない」という意味です。

于 2012-05-21T13:17:32.327 に答える
4

Peterとmprivatに同意しますが、本当にこれを行う必要がある場合の解決策は次のとおりです。

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm a") {
        public synchronized Date parse(String source) throws ParseException {
            Calendar cal = Calendar.getInstance();
            Date d = super.parse(source);
            cal.setTime(d);
            if (cal.get(Calendar.YEAR) > 9999 ) {
                throw new ParseException("Year too long", 11);
            }
            return d;
        };
    };
于 2012-05-21T13:34:37.873 に答える
2

約18000年後の未来です。すべての科学的論理に合格します。では、なぜ 20016 年が遅延であってはならないのでしょうか? :)

(スレッドセーフではないため、SDF は非推奨としてマークする必要があることに注意してください)

于 2012-05-21T13:18:05.087 に答える