SimpleDateFormat не отклоняет ввод отсутствующего века в год ввода, несмотря на «ГГГГ» в шаблоне форматирования

StackOverflow https://stackoverflow.com/questions/4410524

  •  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?

То Threeten-Extra Проект расширяет Java.Time с дополнительными классами. Этот проект является доказательством для возможных будущих дополнений в Java.Time. Вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter, а также более.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top