О первый вопрос:
Класс SimpleDateFormat
очень мягок и просто останавливается, когда некоторые недопустимые символы ударяются. Даже если вы явно поручите ему разобрать строго через df.setLenient(false);
, вы заметите здесь тот же вывод и не исключение. JodaTime, JSR-310 или моя библиотека времени корректно отклонят ввод, содержащий недопустимые символы в строгом режиме. Итак, у нас есть явная ошибка в JDK.
О второй вопрос:
Ну, вы используете java.sql.Date
вместо java.util.Date
. Sql-версия не рассчитана на годы> 9999. Это даже указано в ее javadoc:
«дата миллисекунд с 1 января 1970 года, 00:00:00 GMT не должна превышать представление миллисекунды за 8099 год»,
Не ясно в javadoc, но Oracle говорит о смещении года 1900 г. Таким образом, наконец java.sql.Date
поддерживает только диапазон года до 9999. Это соответствует ANSI-SQL, поэтому никакое ограничение в этом году не является ошибкой, но необходимо для взаимодействия с SQL.Вместо этого другой аспект плохой, и, на мой взгляд, ошибка, а именно: если вы кормите конструктор недействительным годом, тогда вы не получите никакого исключения, но внутренне состояние будет тихо настроено на что-то глупое и непредсказуемое.
Вывод:
Избегайте использовать java.sql.Date
что-нибудь еще, чем в слое JDBC. Это не для прикладного уровня. Кроме того, java.util.Date
, а также SimpleDateFormat
(которые являются «стандартными» в Java-pre8) более или менее ужасно нарушены. Хорошими альтернативами являются JodaTime, в Java 8 - новый JSR-310-API или моя библиотека, если он достигнет не-альфа-состояния в один прекрасный день.
1. Парсер останавливается после чтения того, что он может интерпретировать. 2. Парсер может быть * мягким *. –
Какова ценность 'parsedDate'? Я думаю '3-01-09'. –
да, я получил '0003-09-01'. это я получаю даже для 'df.parse (« 09/01/3 ~ qwwww »)' – gowthamvelusamy