2017-02-21 6 views
3

Я пытаюсь проанализировать дату в соответствии со следующим кодом, но получаю исключение. Ниже приведен код -Неожиданное исключение во время разбора

public class DateTest { 
    public static void main(String args []) { 
     String start = "23-Jan-2017"; 
     DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy hh:mm a"); 

     try { 
      Date parsedDate = dateFormatTripStartDate.parse(start); 
      System.out.println(parsedDate); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Исключение:

java.text.ParseException: Unparseable date: "23-Jan-2017" 
    at java.text.DateFormat.parse(DateFormat.java:357) 
    at DateTest.main(DateTest.java:18) 

Пожалуйста, помогите мне определить эту проблему. Благодарю.

+0

Формат, который вы используете, должен соответствовать формату синтаксического анализа String. –

+1

[MCVE] (http://stackoverflow.com/help/mcve) от пользователя 1-rep? Я сказал да! +1 –

+0

Смешно вы можете сделать это наоборот: строка может содержать дополнительные символы после даты, они просто игнорируются. Но строка не может быть меньше, чем требуется шаблону формата. –

ответ

4

Удалите часть времени в вашей схеме:

DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy"); 
+0

Обратите внимание, что противоположное работает, имея временную часть в «String date», но не в шаблоне, так как это шаблон, который используется для анализа 'String' – AxelH

0

Прежде всего, ответ от kamehl23 правильно. В вашей синтаксической цепочке может отсутствовать какой-либо парт, который указан в формате, и поэтому вам нужно будет изменить свой формат до DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");. Однако просто добавьте еще несколько интересных вариантов:
Помните, что SimpleDateFormat не является потокобезопасным и вообще не рекомендуется. Разумные предустановки Java 8 -
Apache FastDateFormat и
joda-time упаковка.
У обоих есть некоторые проблемы, но, безусловно, намного лучше, чем SimpleDateFormat (пакет Joda-time очень популярен).
В Java 8 была введена новая дата и время hanling с пакетом java.time.format Требуется время, чтобы приспособиться к нему, но оно прекрасно работает и решает многие проблемы, которые существовали в этой области. См. Класс DateTimeFormatter.
И, наконец, мне когда-то пришлось написать утилиту, которая может взять строку в любом формате и попытаться проанализировать ее на Date, если это возможно. Я написал статью, в которой описывается, как я реализовал эту Утилиту. Я написал его в Java 8, но идея могла быть реализована в любой версии. См. Java 8 java.time package: parsing any string to date

0

Вы используете шаблон "dd-MMM-yyyy hh: mm a". Но в фактической части «hh: mm a» нет в значении «23-янв-2017». Из-за этого функция parse не может проанализировать дату строки.

Так что измените свой шаблон на «dd-MMM-yyyy», который соответствует вашей строке даты. Это устранит исключение, которое вы получаете.

2

TL; др

LocalDate.parse( 
    "23-Jan-2017" , 
    DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US) 
) 

Использование java.time

Другие ответы являются правильными о форматировании шаблонов несовпадающих входных данных. Но и вопрос, и другие ответы устарели.

Современный способ состоит из классов java.time, которые вытесняют неприятные старые классы времени.

Класс LocalDate представляет собой значение только для даты без времени суток и без часового пояса.

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US); 
LocalDate ld = LocalDate.parse("23-Jan-2017" , f); 

ld.toString(): 2017-01-23

Укажите Locale, как определяет человеческий язык, используемый, чтобы перевести название месяца. Если этот параметр опущен, то по умолчанию используется стандартное значение Locale JVM. Это значение по умолчанию может быть изменено в любой момент любым кодом в любом потоке любого приложения в JVM, поэтому не полагайтесь на него.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

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

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter, andfz more.