SimpleDateFormat не отклоняет ввод отсутствующего века в год ввода, несмотря на «ГГГГ» в шаблоне форматирования
-
08-10-2019 - |
Вопрос
У меня есть SimpleDateFormat с рисунком yyyy-M-d"
, и следующий сценарий:
String str = "02-03-04";
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d");
f.setLenient(false);
System.out.println(f.parse(str));
Вывод Sat Mar 04 00:00:00 EST 2
Моя цель состояла в том, чтобы только поймать даты в формате, как 2004-02-03 и игнорировать 02-03-04. Я думал, что Южи в шаблоне потребует 4-значного года, но ясно это не так. Может кто-нибудь объяснить, почему это не бросает исключение анализа? Я хотел бы это ...
Решение
Ну, я могу объяснить это от Документы:
Для анализа, если количество шаблонов букв более 2, год интерпретируется буквально, независимо от количества цифр. Таким образом, используя шаблон «ММ / ДД / ГГГГ», «01/11/12» разборки до 11 января 12 объявлений
Возможно, что Joda Time будет более строгим - и это лучше API в целом, ИМО ...
Вы всегда можете бросить исключение, если этот год меньше 1000 после анализа ...
Другие советы
TL; доктор
С использованием Java.Time., Этот вход с этим форматированием шаблона не удается, как вы ожидаете.
LocalDate
.parse(
"02-03-04" ,
DateTimeFormatter.ofPattern ( "uuuu-M-d" )
)
... бросает java.time.format.DateTimeParseException
Java.Time.
Классы, которые вы используете, теперь вытеснены современными Java.Time. Классы, определенные в JSR 310 и встроены в Java 8, а затем.
То LocalDate
Класс представляет собой значение только даты без времени дня и без часовой пояс или Offset-from-UTC.
Определите пользовательскую структуру форматирования, как вы спросили. Использовать DateTimeFormatter
сорт.
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu-M-d" );
Попробуйте анализировать свой вклад.
String input = "02-03-04";
LocalDate localDate = LocalDate.parse ( input , f );
Мы сталкиваемся о DateTimeParseException
, неудача в пропущенном веке года вклада. Как вы ожидали.
Исключение в потоке «Главная» Java.time.format.dateTimeprseException: Text '02 -03-04 'не может быть проанализирован при индексе 0
О Java.Time.
То Java.Time. Рамки встроены в Java 8, а затем. Эти классы вытесняют проблему старого наследие Классы даты времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Учебник Oracle. Отказ И поиск стека переполнения для многих примеров и пояснений. Спецификация JSR 310..
То Joda-Time Проект, сейчас в Режим технического обслуживания, советует миграцию к Java.Time. классы.
Вы можете обменять Java.Time. Объекты напрямую с вашей базой данных. Использовать JDBC драйвер совместимый с JDBC 4.2 или позже. Нет необходимости в струнах, нет необходимости в java.sql.*
классы.
Где получить классы Java.Time?
- Java SE 8., Java SE 9., Java SE 10., Java SE 11., а позже - часть стандартных java API с включенной внедрением.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6. а также Java SE 7.
- Большинство из Java.Time. Функциональность возвращается на Java 6 и 7 в Threeten-Backport..
- Андроид
- Позже версии Android Bundle Aflations Java.Time. классы.
- Для ранее Android (<26), Threetenabp. Адапты проекта Threeten-Backport. (упомянутый выше). Видеть Как использовать THRETENABP ....
То Threeten-Extra Проект расширяет Java.Time с дополнительными классами. Этот проект является доказательством для возможных будущих дополнений в Java.Time. Вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
, а также более.