Java: ParseException: неразборчивая дата

у меня есть SimpleDateFormat format = new SimpleDateFormat("d M y H:m");, и я пытаюсь проанализировать с его помощью строку "8 Jan 2019 16:47", но получаю ParseException. Я создал его неправильно? Согласно docs.oracle.com, M должен распознавать 3-буквенные месяцы. Может кто-нибудь помочь мне?


person Ginso    schedule 14.01.2019    source источник
comment
Jan не подходит для M. Попробуйте MMM вместо M для месяца.   -  person ernest_k    schedule 14.01.2019
comment
@ernest_k Ваше предложение работает в этой демонстрации.   -  person Tim Biegeleisen    schedule 14.01.2019
comment
Я рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDateTime и DateTimeFormatter из java.time, современного API даты и времени Java.   -  person Ole V.V.    schedule 14.01.2019


Ответы (2)


Официальная документация: (https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

Вы, вероятно, пропустили вот эту маленькую заметку:

Месяц: если количество букв шаблона равно 3 или более, месяц интерпретируется как текст; в противном случае он интерпретируется как число.

На основе вашего примера ввода работает следующее:

SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy HH:mm");
person Timothy T.    schedule 14.01.2019

Java.время

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMM y H:mm", Locale.ENGLISH);

    String stringToParse = "8 Jan 2019 16:47";
    LocalDateTime dateTime = LocalDateTime.parse(stringToParse, formatter);
    System.out.println(dateTime);

Вывод из этого фрагмента:

2019-01-08T16:47

Что пошло не так в вашем коде?

SimpleDateFormat и Date плохо спроектированы и давно устарели, первый, в частности, печально известен своими проблемами. Я рекомендую вам не использовать их в 2019 году.

Как уже говорили другие, вам нужно три M для сокращения месяца (независимо от того, используете ли вы устаревшее SimpleDateFormat или современное DateTimeFormatter). Один M будет соответствовать номеру месяца, состоящему из 1 или 2 цифр, например 1 для января.

Вы также должны указать локаль для вашего форматтера. Я принял Jan за английский язык, поэтому указал Locale.ENGLISH. Если вы не укажете локаль, будет использоваться локаль JVM по умолчанию, которая может хорошо работать на некоторых JVM и внезапно сломаться в один прекрасный день, когда локаль по умолчанию была изменена или вы пытаетесь запустить свою программу на другом компьютере.

Ссылка на сайт

Учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.

person Ole V.V.    schedule 14.01.2019