у меня есть SimpleDateFormat format = new SimpleDateFormat("d M y H:m");
, и я пытаюсь проанализировать с его помощью строку "8 Jan 2019 16:47"
, но получаю ParseException. Я создал его неправильно? Согласно docs.oracle.com, M должен распознавать 3-буквенные месяцы. Может кто-нибудь помочь мне?
Java: ParseException: неразборчивая дата
Ответы (2)
Официальная документация: (https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)
Вы, вероятно, пропустили вот эту маленькую заметку:
Месяц: если количество букв шаблона равно 3 или более, месяц интерпретируется как текст; в противном случае он интерпретируется как число.
На основе вашего примера ввода работает следующее:
SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy HH:mm");
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
.
Jan
не подходит дляM
. ПопробуйтеMMM
вместоM
для месяца. - person ernest_k   schedule 14.01.2019SimpleDateFormat
иDate
. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйтеLocalDateTime
иDateTimeFormatter
из java.time, современного API даты и времени Java а>. - person Ole V.V.   schedule 14.01.2019