Java SimpleDateFormat возвращает неожиданный результат
Я пытаюсь использовать SimpleDateFormat Java для синтаксического анализа строки на сегодняшний день со следующим кодом.
public class DateTester {
public static void main(String[] args) throws ParseException {
String dateString = "2011-02-28";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
System.out.println(dateFormat.parse(dateString));
}
}
Я ожидал некоторую ошибку синтаксического анализа. Но интересно, он печатает следующую строку.
Wed Jul 02 00:00:00 IST 195
Не могу это объяснить. Может ли кто-нибудь помочь?
Спасибо
Ответы
Ответ 1
SimpleDateFormat
проанализировал 2011
как номер месяца 2011, потому что месяц (MM
) является первой частью шаблона даты.
Если вы добавите 2011 год к году 28, вы получите 195 год.
2011 месяца - 167 лет и 7 месяцев. Июль - 7-й месяц. Вы указали 02 как день, 28 как год, 28 + 167 = 195, поэтому 02 July 195
верен.
Ответ 2
По умолчанию SimpleDateFormat является снисходительным, поэтому для его отказа вам нужно сделать:
dateFormat.setLenient( false ) ;
перед разбором даты. Вы получите исключение:
java.text.ParseException: Unparseable date: "2011-02-28"
Ответ 3
Вызвать setLenient(false)
в формате даты. Затем вы получите свое исключение синтаксиса, например:
groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy")
===> [email protected]
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("2011-02-28")
ERROR java.text.ParseException:
Unparseable date: "2011-02-28"
at java_text_DateFormat$parse.call (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:2)
...
Богемский прав, если вы не установите свойство lenient, тогда JDK будет наклоняться назад, понимая мусор, который он дал:
groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy");
===> [email protected]
groovy:000> df.parse("13-01-2011")
===> Sun Jan 01 00:00:00 CST 2012
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("13-01-2011")
ERROR java.text.ParseException:
Unparseable date: "13-01-2011"
at java_text_DateFormat$parse.call (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:2)
...