Исключение java.text.Parse: неразборчивая дата

У меня есть следующий код:

  String ModifiedDate = "1993-06-08T18:27:02.000Z" ;  
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
  Date ModDate = sdf.parse(ModifiedDate);

Я получаю следующее исключение, хотя мой формат даты в порядке...

java.text.ParseException: Unparseable date: "1993-06-08T18:27:02.000Z"
at java.text.DateFormat.parse(DateFormat.java:337)

person user2133404    schedule 12.06.2014    source источник
comment
Попробуйте одинарную кавычку 'Z' SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd'T'HH:mm:ss.SSS'Z');   -  person gtgaxiola    schedule 12.06.2014
comment
Вы хотите использовать ISODateTimeFormat (который есть в joda)? Может быть лучше для этого стандарта ISO8601. См. stackoverflow.com/questions/5393847/   -  person demongolem    schedule 12.06.2014


Ответы (2)


Последний шаблон Z указывает на часовой пояс RFC 822. Ваша строка

String ModifiedDate = "1993-06-08T18:27:02.000Z" ;  

не содержит такого часового пояса. Он буквально содержит Z.

Вам понадобится шаблон даты, который, как и литерал T, имеет литерал Z.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

Если вы хотели, чтобы Z указывало время Зулу, добавьте его в качестве часового пояса при построении SimpleDateFormat.

sdf.setTimeZone(TimeZone.getTimeZone("Zulu"));;
person Sotirios Delimanolis    schedule 12.06.2014
comment
Я добавлю изменение ModifiedDate, чтобы учесть разницу в часовых поясах, например «2001-07-04T12:08:56.235-0700» Раздел примеров SampleDateFormat - person gtgaxiola; 12.06.2014
comment
@gtgaxiola Безусловно, если OP может изменить свою входную строку, это может быть проще сделать. - person Sotirios Delimanolis; 12.06.2014

Правильный ответ Сотириоса Делиманолиса. Z означает время Зулу, нулевое смещение от UTC (+00:00). Другими словами, не привязаны ни к какому часовому поясу.

Джода-Время

К вашему сведению, библиотека Joda-Time значительно упрощает эту работу, как и новый пакет java.time в Java 8.

Используемый формат определяется стандартом ISO 8601. Joda-Time и java.time по умолчанию анализируют и генерируют строки ISO 8601.

DateTime в Joda-Time знает назначенный ему часовой пояс. Поэтому в процессе анализа укажите часовой пояс для настройки.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", timeZone );
String output = dateTime.toString();

При желании вы можете сохранить объект DateTime в универсальном времени.

DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", DateTimeZone.UTC );

Когда этого требуют другие классы, вы можете сгенерировать объект java.util.Date.

java.util.Date date = dateTime.toDate();
person Basil Bourque    schedule 13.06.2014