Решение здесь и сейчас:
System.setProperty("java.locale.providers", "COMPAT,CLDR");
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
System.out.println(dateTime);
Вывод (протестировано на Java 9 и Java 10):
2018-05-09T09: 17: 24
Единственное изменение в вашем коде - я вставил System.setProperty("java.locale.providers", "COMPAT,CLDR");
в начале программы. В соответствии с документацией, это не должно сработать, но сработало, когда я попробовал. Вместо этого правильным способом является предоставление того же системного свойства в командной строке при запуске вашей Java-программы. Например:
java -Djava.locale.providers=COMPAT,CLDR com.ajax.ParseTwoLetterDayOfWeekAbbreviationInGerman
Спасибо Джоупу Вейерсу за то, что он указал в комментарии, что свойство должно быть установлено в командной строке. Как ни странно, одно и то же системное свойство нарушало код на моем Java 8.
Более современное решение:
String dateString = "Mi. Mai 09 09:17:24 2018";
Мне потребовалась точка (точка) после Mi
в строке, чтобы обозначить, что это сокращение.
Региональные поставщики
Для разбора даты на немецком языке Java нужны так называемые данные о локали, включая названия и сокращения дней недели и месяцев, используемых на немецком и других языках. Чтобы запутать вещи, эти данные поступают из более чем одного источника. Во всех Java 8, 9 и 10 Java содержит данные о региональных стандартах, по крайней мере, из двух источников: собственные данные о региональных стандартах Java и стандартизированные данные о региональных стандартах CLDR, хранилище данных Unicode Common Locale (не знаю, есть ли еще один или два источника) , В Java 8 собственные данные Java были по умолчанию, и вам нужно было бы указать CLDR, если вы хотите вместо этого эти данные. В Java 9 и более поздних версиях все наоборот: по умолчанию используется CLDR, но старые данные Java доступны как COMPAT. Это объясняет комментарий к , что ваш код работает на Java 8, но не работает на Java 10.
И, очевидно, данные локали Java имеют Mi
без точки как сокращение для Mittwoch (среда), в то время как CLDR имеет Mi.
с точкой. Есть много других отличий.
Ссылки