Подтвердить что ты не робот

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

Как это решить?

4b9b3361

Ответ 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?

  • Java SE 8, Java SE 9, Java SE 10 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые мелкие функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект 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));