Что не так с кодом разбора даты Java? - PullRequest
0 голосов
/ 13 сентября 2018

Этот код 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 ]

0 голосов
/ 13 сентября 2018

Ну, для этого вам нужно создать собственный форматтер, который не так уж и сложен (в первый раз знание русского языка пригодится, отвечая на вопрос stackoverflow):

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
0 голосов
/ 13 сентября 2018

Привет, используйте этот кусок кода:

    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);
0 голосов
/ 13 сентября 2018

Есть две проблемы:

Первый , ofPattern просто создает форматировщик на основе шаблона, поэтому отбрасывает локаль:

DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
                 .withLocale(new Locale("ru", "RUS"))
                 .ofPattern("dd MMM yyyy") // <------ static method!!

ofPatternстатический метод, который просто создает новый экземпляр DateTimeFormatter (правильный способ его создания приведен ниже)


Second : короткое имя месяца для шаблона кажется неверным:

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")))
...