java.time.format.DateTimeParseException: текст «Mi Mai 09 09:17:24 2018» не может быть проанализирован с индексом 0 - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь отформатировать объект даты и времени с немецким языком, но я получил ошибку.

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);

Ошибка:

java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Решение здесь и сейчас:

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. с точкой. Есть много других отличий.

Ссылки

0 голосов
/ 09 мая 2018
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;



/**
 *
 * @author Ali Hassan
 */
public class LeapTEST {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        String dateString = "Mi Mai 09 09:17:24 2018";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM d HH:mm:ss yyyy", Locale.GERMAN);
    LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
    System.out.print(dateTime);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...