4

パターンは「dd-MM-yyyy」

文字列「01-01-2010mwwwwwwwwwwwwwww」はパターンを満たさないと思いますが、次のコードは逆です。

誰でも理由を説明できますか?

public static void main(String[] args) throws Exception {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

    Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww");

    System.out.println(date);
}

ありがとう

4

2 に答える 2

16

parse メソッドは、入力文字列全体との一致を試みません。つまり、プレフィックスが01-01-2010一致し、それで十分です。

からDateFormat.parse:

指定された文字列の先頭からテキストを解析して日付を生成します。メソッドは、指定された文字列のテキスト全体を使用しない場合があります。


それが「完全一致」であったかどうかを確認する必要がある場合は、次のことを試すことができます。

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

String strDate = "01-01-2010mwwwwwwwwwwwwwww";
ParsePosition pp = new ParsePosition(0);
Date date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

strDate = "01-01-2010";
pp = new ParsePosition(0);
date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

これは印刷します

Complete match: false
Complete match: true
于 2010-06-11T20:24:05.253 に答える
0

これは、DateFormat のデフォルトの寛大なパラメーターが true であるためです。これは、パーサーが入力文字列の形式が正しくなくても解析することを意味します。これは(いつか)誤った結果につながります。

一方、パーサーを特定のパターンに厳密にすることができます。これは、間違った入力文字列が例外をスローすることを意味します。

public static void main(String[] args) throws Exception {
  SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
  df.setLenient(false); // Switch to strict mode
  Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww"); // This will throw an exception
  System.out.println(date);
}
于 2010-08-26T05:16:25.623 に答える