1

を使用して、文字列形式の日付を日付に変換しようとしていましたDateUtils。以下は私の予想される日付形式です、

private static final String[] EXPECTED_DATE_FORMAT = {"yyyy-MM-dd","dd-MM-yyyy","dd-MMM-yyyy",};

そして、次の値に対してテストを実行しました。

System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("2019-05-18", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-05-2019", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-May-2019", EXPECTED_DATE_FORMAT));

そして、私は次の結果を得ています、

Sat May 18 00:00:00 IST 2019
Tue Nov 09 00:00:00 IST 23
Sat May 18 00:00:00 IST 2019

2 番目の値 " 18-05-2019" が形式 " " と一致せずdd-MM-yyyy、同じ結果になるのはなぜですか? dd-MM-yyyyと の両方をサポートする必要がある変更は何yyyy-MM-ddですか?

4

2 に答える 2

2

これは、 がDateUtils.parseDate内部的SimpleDateFormatに "寛大な解析" ( SimpleDateFormat.setLenient(true)) を使用しているために発生します。寛大な解析とは、大まかに言うと、文字列がパターンと正確に一致しない場合、パーサーが文字列を解釈して意味のある日付を取得する方法をヒューリスティックに「推測」しようとすることを意味します。あなたの例では、最初のパターンは使用するのに「十分」であると見なされ、パーサーが混乱させるため、2番目の文字列は失敗します。

DateUtils.parseDateStrictly寛大さを無効にするために使用できます。

于 2019-05-17T10:18:25.663 に答える