Java.text.ParseException: Непревзойденная дата
Я получаю исключение при синтаксическом анализе, когда пытаюсь выполнить следующий код:
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Исключение:
Exception in thread "main" java.text.ParseException: Unparseable date: "Sat Jun 01 12:53:10 IST 2013"
at com.ibm.icu.text.DateFormat.parse(DateFormat.java:510)
Вход: Sat Jun 01 12:53:10 IST 2013
Ожидаемый результат: Jun 01,2013 12:53:10
Как это решить?
Ответы
Ответ 1
Ваш шаблон не соответствует входной строке вообще... Неудивительно, что она не работает. Это, вероятно, будет работать лучше:
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
Locale.ENGLISH);
Затем для печати в требуемом формате вам понадобится второй SimpleDateFormat:
Date parsedDate = sdf.parse(date);
SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
System.out.println(print.format(parsedDate));
Примечания:
- вы должны включить локаль, как будто ваш язык не является английским, имя дня может не распознаваться
- IST неоднозначен и может привести к проблемам, поэтому вы должны использовать правильное имя часового пояса, если это возможно на вашем входе.
Ответ 2
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
Date currentdate=sdf.parse(date);
SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
System.out.println(sdf2.format(currentdate));
Ответ 3
Неверный шаблон
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Ответ 4
Обновите свой формат до:
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
Ответ 5
- Ваш шаблон форматирования не соответствует входной строке, как отмечено другими Ответчиками.
- Ваш формат ввода ужасен.
- Вы используете проблемные старые классы даты и времени, которые были вытеснены годами назад классами java.time.
ISO 8601
Вместо такого формата, как ваш, используйте стандартные форматы ISO 8601 для обмена значениями даты и времени в виде текста.
Классы java.time по умолчанию используют стандартные форматы ISO 8601 при разборе/генерации строк.
Правильное название часового пояса
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, такое как EST
или IST
, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
Ваш IST
может означать стандартное время Исландии, стандартное время Индии, стандартное время Ирландии или другие. Классы java.time оставлены для простого предположения, так как нет логического решения этой неоднозначности.
java.time
Современный подход использует классы java.time.
Определите шаблон форматирования в соответствии со строками ввода.
String input = "Sat Jun 01 12:53:10 IST 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString(): 2013-06-01T12:53:10Z[Atlantic/Reykjavik]
Если ваш ввод не был предназначен для Исландии, вы должны предварительно проанализировать строку, чтобы установить правильное имя часового пояса. Например, если вы уверены, что ввод был предназначен для Индии, замените IST
на Asia/Kolkata
.
String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString(): 2013-06-01T12:53:10+05:30[Asia/Kolkata]
О java.time
Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые унаследованные классы времени и даты, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на классы java.time.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в классах java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще more.
Ответ 6
Я нашел простое решение для получения текущей даты без какой-либо ошибки синтаксического анализа.
Calendar calendar;
calendar = Calendar.getInstance();
String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
Ответ 7
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Этот шаблон не совпадает с вашей строкой ввода, которая встречается с исключением.
Вам нужно использовать следующий шаблон, чтобы выполнить работу.
E MMM dd HH:mm:ss z yyyy
Следующий код поможет вам пропустить исключение.
SimpleDateFormat
используется.
String date="Sat Jun 01 12:53:10 IST 2013"; // Input String
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern
Date currentdate=simpleDateFormat.parse(date); // Returns Date Format,
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern
System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern
// outputs: Jun 01,2013 12:53:10
Ответ 8
Проверьте ваш шаблон (ДД-МММ-ГГГГ) и вход для метода анализа ("29-11-2018").
Вход для метода разбора должен следовать: ДД-МММ-ГГГГ i, e. 21-AUG-2019
В моем коде:
String pattern = "DD-MMM-YYYY";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
try {
startDate = simpleDateFormat.parse("29-11-2018");// here no pattern match
endDate = simpleDateFormat.parse("28-AUG-2019");// Ok
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Ответ 9
Мне нужно было добавить выражение ParsePosition
в метод parse класса SimpleDateFormat
:
simpledateformat.parse(mydatestring, new ParsePosition(0));