ParseException при разборе трехсимвольного сокращенного месяца с использованием SimpleDateFormat

Вот мой код,

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
Date dft  = (Date) format.parse("16-MAY-2018 09:30:22:000");

Я получаю исключение ниже

java.text.ParseException: неразборчивая дата: "16-MAY-2018 09:30:22"

Что нужно использовать для анализа миллисекунд?


person zyan Billings    schedule 03.05.2018    source источник
comment
Ваш шаблон говорит: MM, ваша строка имеет MAY. Если вы очень внимательно посмотрите, то увидите, что это не совсем совпадает. 16-05-2018 09:30:22 — это строка, необходимая для вашего шаблона.   -  person Ben    schedule 03.05.2018
comment
Чтение документации показывает, что этот месяц: Если количество букв шаблона 3 и более, месяц интерпретируется как текст; в противном случае он интерпретируется как число.   -  person Malte Hartwig    schedule 03.05.2018
comment
@FedericoklezCulloca MM делает подразумевает, что месяц должен быть числом. Если количество букв шаблона равно 3 и более, месяц интерпретируется как текст; в противном случае он интерпретируется как число. Таким образом, для MM количество букв шаблона меньше 3, поэтому месяц интерпретируется как число.   -  person khelwood    schedule 03.05.2018
comment
Кроме того, в ответе на этот вопрос не упоминается, что синтаксический анализ всегда будет завершаться ошибкой, если ваш Locale не является Locale.Englishили Locale.English указанным в качестве второго параметра для конструктора SimpleDateFormat.   -  person Ben    schedule 03.05.2018
comment
По какой-то конкретной причине вы используете давно устаревшие классы Date и SimpleDateFormat? Я рекомендую вам забыть о них и вместо этого использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.   -  person Ole V.V.    schedule 03.05.2018


Ответы (5)


Шаблон должен быть МММ, потому что в месяце три символа.

Вы также должны предпочесть классы java.time к тем, которые вы используете в настоящее время, если вы используете Java 8 или выше:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .appendPattern("dd-MMM-yyyy")
    .appendLiteral(' ')
    .append(ISO_LOCAL_TIME)
    .toFormatter();

LocalDateTime timestamp = LocalDateTime.parse("16-May-2018 09:30:22", formatter);
person Michael    schedule 03.05.2018
comment
А как насчет миллисекунд? я не умею считать миллисекунды - person zyan Billings; 03.05.2018
comment
@zyanBillings ISO_LOCAL_TIME уже включает необязательную десятичную точку, до 9 цифр для долей секунды. - person Michael; 03.05.2018
comment
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS"); java.util.Date d1 =(java.util.Date)format.parse("03-MAY-2018 08:00:00:000 AM"); timeFormat = "dd-MMM-yyyy HH:mm:ss.SSS"; Я пытаюсь, как показано ниже, и получаю такое же исключение - person zyan Billings; 03.05.2018
comment
Вы проигнорировали мой совет о java.time или используете ‹= Java 7? - person Michael; 03.05.2018
comment
@zyanBillings Нет большой проблемы. java.time был перенесен. Все, что вам нужно для Java 6 и 7, — это ThreeTen Backport. Наслаждаться. - person Ole V.V.; 03.05.2018
comment
Чтобы разобрать MAY в верхнем регистре, добавьте вызов parseCaseInsensitive перед вызовом appendPattern. - person Ole V.V.; 03.05.2018
comment
Учитывая, что аббревиатуры месяцев указаны на английском языке, необходимо также указать англоязычную локаль. Например .toFormatter(Locale.ENGLISH). - person Ole V.V.; 04.05.2018

Используйте этот шаблон: дд-МММ-гггг ЧЧ:мм:сс

person Nitin    schedule 03.05.2018

Date dft  = (Date) format.parse("16-05-2018 09:30:22");

ИЛИ изменить его на

SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
person piy26    schedule 03.05.2018
comment
После этого я получаю исключение ниже › java.util.Date не может быть приведен к java.sql.Date - person zyan Billings; 03.05.2018
comment
Пожалуйста, измените оператор импорта на import java.util.Date; - person piy26; 03.05.2018
comment
Класс Date предоставляется как java.util.Date, так и java.sql.Date. Вам нужно использовать тот из пакета util. Это правильный вариант для использования здесь. - person piy26; 03.05.2018

вы используете dd-MM-yyyy HH:mm:ss, поэтому разборчиво

16-05-2018 09:30:22

и если вы хотите 16-MAY-2018 09:30:22, используйте

dd-MMM-yyyy HH:mm:ss
person Vishal Hatti    schedule 03.05.2018

"16-MAY-2018 09:30:22" не поддается разбору с таким форматом времени. Если вы хотите проанализировать это, вам нужно изменить формат даты на «дд-МММ-гггг ЧЧ: мм: сс». Двойная М предназначена только для пронумерованных месяцев (поэтому должно быть 05 для мая).

Дополнительные сведения см. в javadoc SimpleDateFormat: здесь

person Lorelorelore    schedule 03.05.2018