Unparseable Date: «Название дня недели» (SimpleDateFormat)

Я пытаюсь преобразовать дату из String в объект Date:

String dateString = "Mon, 04 Sep 2017 18:30:28";
String dateFormat = "EEE, dd MMM yyyy HH:mm:ss";

Приводит к следующему исключению:

java.text.ParseException: неразборчивая дата: «Пн, 04 сентября 2017 г., 18:30:28»

Я пробовал разные строки и форматы, и проблемы, похоже, связаны с названием недели («EEE»). Без него работает отлично.

Также это отлично работает:

String dateString = "04 Sep 2017 18:30:28, Mon";
String dateFormat = "dd MMM yyyy HH:mm:ss, EEE";

person Dampignak    schedule 05.09.2017    source источник
comment
Имена указаны на английском языке, поэтому это может быть связано с локалью: stackoverflow.com/q/6154772/7605325   -  person    schedule 05.09.2017
comment
Можете ли вы предоставить фактический код, который вы написали для анализа даты?   -  person Lothar    schedule 05.09.2017
comment
Кроме того, я рекомендую вам пропустить устаревшие классы Date и SimpleDateFormat. Современный API даты и времени Java, также известный как java.time или JSR-310, гораздо удобнее работать с.   -  person Ole V.V.    schedule 05.09.2017
comment
@ОлеВ.В. Спасибо за совет. Я посмотрю на это в будущем. Но я работаю над более крупным проектом, и мне нелегко (на самом деле это довольно сложно) вводить новые API/библиотеки :-)   -  person Dampignak    schedule 05.09.2017
comment
Если вы используете Java 8 или 9, новый API встроен. Возможно, вы сможете начать использовать его, и никто этого не заметит. :-) Чтобы использовать его с Java 6 или 7, вам понадобится ThreeTen Backport, который вы, вероятно, не может быть представлен без одобрения проекта (хотя это будет необходимо только до тех пор, пока вы в конечном итоге не перейдете на Java 8).   -  person Ole V.V.    schedule 05.09.2017
comment
@Dampignak Вы можете легко конвертировать в/из типов java.time, поэтому на самом деле довольно легко интегрировать новый код в существующий проект. Для Java 8 и более поздних версий обратите внимание на новые методы преобразования, добавленные к старым классам. В обратном порту найдите служебный класс для методов преобразования.   -  person Basil Bourque    schedule 05.09.2017


Ответы (2)


Месяц и дни недели являются сокращенным текстом. Текст зависит от языка, и если вы не укажете конкретную локаль при создании экземпляра SimpleDateFormatter, вместо нее будет использоваться локаль системы. Причина, по которой ваш синтаксический анализ не работает с днем ​​недели, а не с месяцем, может заключаться в том, что сокращенное название месяца на языке вашей системы по умолчанию совпадает с английским.

Вот некоторый код, как вы должны анализировать дату с текстом:

SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
formatter.setLenient(false);
ParsePosition pos = new ParsePosition(0);
return formatter.parse(toParse, pos);

где toParse представляет собой строку, содержащую вашу дату в виде текста.

person Lothar    schedule 05.09.2017
comment
Вы правы, но я до сих пор не понимаю, почему второй случай (название месяца + название дня) работает, а первый случай нет (название дня в начале) - person Dampignak; 05.09.2017
comment
@Dampignak Этого тоже не объяснить. По крайней мере, не зная языкового стандарта вашей системы по умолчанию (System.out.println(Locale.getDefault()); должен показать его вам, если вы не знаете) - person Lothar; 05.09.2017
comment
Мой язык по умолчанию — немецкий (de_DE). - person Dampignak; 05.09.2017
comment
@Dampignak Sep — это одна и та же аббревиатура на немецком и английском языках. - person Meno Hochschild; 05.09.2017
comment
@MenoHochschild Понедельник и Монтэг тоже. Вот почему это немного странно, я ожидал, что Дампиньяк ответит что-то вроде fr_FR. - person Lothar; 05.09.2017
comment
Стандартное сокращение для понедельника в немецком языке — это не Mon, а Mo в настенных календарях, так что здесь есть разница по сравнению с английским. - person Meno Hochschild; 05.09.2017
comment
Это может объяснить, почему сработал второй вариант. Поскольку название дня недели находится в конце, проверка завершается с достижением Mo, а n игнорируется. В другом шаблоне указано, что после имени стоит запятая, но после оценки дня недели остается еще n, поэтому шаблон не подходит, что приводит к ошибке синтаксического анализа. - person Lothar; 05.09.2017
comment
@ Лотар, я думаю, ты прав. Просто установите языковой стандарт по умолчанию на немецкий и протестируйте с помощью 04 Sep 2017 18:30:28, Mowhatever, и он работает. Как только шаблон полностью проанализирован, остальная часть ввода игнорируется. - person ; 05.09.2017

Вы не добавили языковой стандарт, который должен был вызвать исключение при анализе текста (текстов) для дня недели и месяца.

    public static void main(String[] args) throws ParseException {
        String dateString = "Mon, 04 Sep 2017 18:30:28";
        SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
        System.out.println(dateFormat.parse(dateString));
    }

Производит следующий вывод

Mon Sep 04 18:30:28 IST 2017
person Sridhar    schedule 05.09.2017
comment
Да, кажется логичным... но почему второй случай работает, а первый нет? У обоих одинаковые поля, но разный порядок? - person Dampignak; 05.09.2017