Это ошибка Java DateFormat? - PullRequest
4 голосов
/ 12 июня 2010

Шаблон "dd-MM-гггг"

Я думаю, что строка "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);
}

Спасибо

Ответы [ 2 ]

16 голосов
/ 12 июня 2010

Метод parse не пытается сопоставить всю входную строку.То есть префикс 01-01-2010 совпадает, и этого достаточно.

From 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
0 голосов
/ 26 августа 2010

Это потому, что параметр по умолчанию для параметра 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);
}
...