Что не так с кодом разбора даты Java?
Этот код Java:
LocalDate.parse("12 Сен 2018", DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(new Locale("ru", "RUS")).ofPattern("dd MMM yyyy"));
приводит к
java.time.format.DateTimeParseException: Text '12 Сен 2018' could not be parsed at index 3
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
Перепробовал все примеры правильных русских месяцев перевода строки Java - безрезультатно.
Что не так с этим кодом?
Примечание: я использую Java 8
Upd: пробовал это на локальной машине и в онлайн-компиляторе - в онлайн-компиляторе работает на локальной машине - пришла ошибка.
Map<Long, String> map = new HashMap<>();
map.put(1L, "Янв");
map.put(2L, "Фев");
map.put(3L, "Мар");
map.put(4L, "Апр");
map.put(5L, "Май");
map.put(6L, "Июн");
map.put(7L, "Июл");
map.put(8L, "Авг");
map.put(9L, "Cен");
map.put(10L, "Окт");
map.put(11L, "Ноя");
map.put(12L, "Дек");
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("dd ")
.appendText(ChronoField.MONTH_OF_YEAR, map)
.appendPattern(" yyyy")
.toFormatter(new Locale("ru", "RU"));
System.out.println(LocalDate.parse("12 Cен 2018", formatter));
3 ответа
Ну, для этого вам нужно создать собственный форматтер, который не так уж и сложен (в первый раз, зная русский язык, вам пригодится ответ на вопрос stackru):
Map<Long, String> map = new HashMap<>();
map.put(1L, "янв");
map.put(2L, "фев");
map.put(3L, "мар");
map.put(4L, "апр");
map.put(5L, "май");
map.put(6L, "июн");
map.put(7L, "июл");
map.put(8L, "авг");
map.put(9L, "сен");
map.put(10L, "окт");
map.put(11L, "ноя");
map.put(12L, "дек");
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("dd ")
.appendText(ChronoField.MONTH_OF_YEAR, map)
.appendPattern(" yyyy")
.toFormatter(new Locale("ru"));
System.out.println(LocalDate.parse("12 сен 2018", fmt)); // 2018-09-12
Привет, используйте этот кусок кода:
Locale locale = new Locale("ru", "RU");
String pattern = "dd MMM yyyy";
String date = "03 сен 2017";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, locale);
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println(localDate);
Есть две проблемы:
Во-первых, ofPattern
просто создает основанный на шаблонах форматер, поэтому отбрасывает локаль:
DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(new Locale("ru", "RUS"))
.ofPattern("dd MMM yyyy") // <------ static method!!
ofPattern
это статический метод, который просто создает новый DateTimeFormatter
экземпляр (см. ниже для правильного способа его создания)
Второе: короткое название месяца кажется неправильным для шаблона:
DateTimeFormatter.ofPattern("dd MMM yyyy")
.withLocale(new Locale("ru", "RUS"))
.format(LocalDate.of(2018, 9, 12))
Результаты в "12 сент. 2018"
, Java ожидает сент.
не сен
,
Это работает и возвращает 2018-09-12
:
LocalDate.parse("12 сент. 2018",
DateTimeFormatter.ofPattern("dd MMM yyyy")
.withLocale(new Locale("ru", "RUS")))