SimpleDateFormat Исключение "Непарсируемая дата" - PullRequest
7 голосов
/ 07 октября 2011

Я пытаюсь разобрать строку даты и времени с SimpleDateFormat.parse(), но я продолжаю получать исключения Unparseable date.

Вот формат даты, который я пытаюсь проанализировать: 2011-10-06T12:00:00-08:00

Воткод, который я использую:

try {
    String dateStr = "2011-10-06T12:00:00-08:00";
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy");
    Date date = dateParser.parse(dateStr);
    System.out.println(dateFormatter.format(date));         
} catch(Exception e) {
    System.out.println(e.getMessage());
}

, который возвращает эту ошибку: java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

Насколько я знаю, это правильный способ использовать класс SimpleDateFormat, но я не беглов Java, чтобы я мог ошибиться.Кто-нибудь знает, в чем моя проблема?

Ответы [ 8 ]

13 голосов
/ 07 октября 2011

Часовой пояс должен быть GMT-08: 00 или -0800 (как сказал Madcore Tom). См. Документы Java .

В Java 7 вы можете использовать «гггг-мм-дд'т'хч: мм: ссх»

11 голосов
/ 07 октября 2011

Я считаю, что SimpleDateFormat не будет анализировать часовые пояса с двоеточием в них (-08: 00).Должно быть в состоянии разобрать дату 2011-10-06T12:00:00-0800.

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

1 голос
/ 03 февраля 2018

ТЛ; др

OffsetDateTime.parse( "2011-10-06T12:00:00-08:00" ) 
    .format( 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( Locale.US )  // Or Locale.CANADA_FRENCH and such.
    )

6 октября 2011 г.

java.time

В современном подходе используются классы java.time , которые вытесняют проблемные старые унаследованные классы даты и времени.

Введенная вами строка имеет формат, соответствующий стандарту ISO 8106 . Классы java.time по умолчанию используют эти стандартные форматы при разборе / генерации строк. Поэтому не нужно указывать шаблон форматирования.

Анализировать как OffsetDateTime, потому что ваши входные строки содержат смещение от UTC, но не часовой пояс.

OffsetDateTime odt = OffsetDateTime.parse( "2011-10-06T12:00:00-08:00" ) ;

odt.toString (): 2011-10-06T12: 00-08: 00

Создать строку в нужном формате. Позвольте java.time автоматически локализовать, а не жестко кодировать шаблоны форматирования.

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( Locale.US );  // Or Locale.CANADA_FRENCH and such.
String output = odt.format( f );

выход: 6 октября 2011 г.

При выделении значения даты и времени в виде текста используйте стандартные форматы ISO 8601, а не локализованный формат.

String output = odt.toLocalDate().toString() ;

2011-10-06


О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

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

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

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

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

1 голос
/ 18 сентября 2017

Сначала необходимо отформатировать значение в "2011-10-06T12: 00: 00-08: 00".

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ");

После этого создайте форматирование для требуемого форматирования.Пример: SimpleDateFormat fmt = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss");

и после разбора даты.Пример: Date date = dateParser.parse (dateFormat); и печать даты в формате.

Ниже приведен один полный пример.

String dataStr = "2011-10-06T12: 00: 00-08: 00";
SimpleDateFormat dataParser = new SimpleDateFormat ("dd / MM / yyyy HH: mm: ss", Locale.US);
Date date;
Try {
date = dataParser.parse (dataStr);
System.out.println (dateFormatter.format (date));

} cath (ParseException e) {

}
0 голосов
/ 27 февраля 2014

Я уверен, что большинство из вас разочарованы тем, что SimpleDateFormat не может обрабатывать формат ISO8601.Вот мой маленький трюк, чтобы решить эту неприятность.

Создайте список известных вам форматов Know, которые вы будете использовать для своего приложения, и примените SimpleDateFormat к списку.Теперь, в вашем методе formatDate (), просто попробуйте все известные вам форматы и перехватите исключение, затем, если у вас все еще нет даты, просто используйте

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime();
if (d == null)
try {
    SimpleDateFormater ...
}

, чтобы попробовать и посмотреть, работает ли это.Для получения дополнительной информации Простой трюк для преобразования формата даты с часовым поясом в Java!

0 голосов
/ 13 июня 2013

Для формата даты, например 2013-06-28T00:00:00+00:00, этот код должен работать:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
0 голосов
/ 07 октября 2011

Я бы настоятельно рекомендовал использовать JodaTime для такого рода вещей.

Вы пытаетесь разобрать формат даты ISO, и Joda делает это «из коробки», и даст вам множество других преимуществ.

Я давно перестал пытаться заставить стандартные классы данных JDK делать полезные вещи.

0 голосов
/ 07 октября 2011

Попробуйте с

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
...