Получение ошибки
java.text.ParseException: Unparseable date: "2018-09-09T09:04:47+00:00"
Что это за формат даты?
Если он прочитал проблему, которая является проблемой, я не смог найти, что это за формат, тогда только я могу написать форматтер.
Да @Antoniossss, но это значение, которое я получаю через службу, мне нужно проанализировать, чтобы преобразовать в метку времени.
@drowny ок. Спасибо.
Это не моя проблема, что сервис использует нестандартные форматы времени.
@Antoniossss, хорошо, я думал, ты пытаешься мне помочь, поэтому объяснил проблему. Но не бери в голову..
Используйте этот метод преобразования в String to date
, который является ISO format
. Но в целом формат ISO заканчивается на Z
, а если нет, то проблем нет. Этот метод возвращает Date и делает все, что вы хотите, от этого возвращаемого значения.
public static Date toCalendar( String isoDate)
throws ParseException {
String s = isoDate.replace("Z", "+00:00");
try {
s = s.substring(0, 22) + s.substring(23); // to get rid of the ":"
} catch (IndexOutOfBoundsException e) {
throw new ParseException("Invalid length", 0);
}
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
}
В Java8 TimeApi
или более поздней версии есть это использование, попробуйте;
OffsetDateTime offsetDateTime = OffsetDateTime.parse( "2018-09-09T09:04:47+01:00" );
Instant instant = offsetDateTime.toInstant();
java.util.Date date = java.util.Date.from( instant );
Или используйте только этот шаблон yyyy-MM-dd'T'HH:mm:ssX
Спасибо, @drowny, но это не работает. Кроме того, я не могу жестко закодировать такие значения, как «+00: 00», потому что это динамические значения, которые я получу от API.
Я добавил альтернативный способ решения, если вы используете java8 или более позднюю версию, попробуйте его, пожалуйста. Ваша строка будет динамической в конце «+00: 00» или whatelse.
Вы должны использовать "X" для часового пояса:
String pattern = "yyyy-MM-dd'T'HH:mm:ssX";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("2018-09-09T09:04:47+00:00");
System.out.println(date);
Спасибо, @Rahim, это именно то, что я искал. Работает отлично.
Лучше использовать новые классы java.time.*
, чем Date
и SimpleDateFormat
Кажется, есть некоторая путаница в этом формате даты, поэтому я объясню.
Это значение даты и времени ISO 8601 со смещением часового пояса.
Использованная литература:
Z
- это спецификатор часового пояса стандарта ISO. Это означает то же самое, что и +00.00
, и в некоторых кругах (например, в вооруженных силах) известно как «зулусское время».
Дата / время ISO 8601 не обязательно должны заканчиваться на Z
. Существуют и другие формы спецификации часового пояса, и действительно, дата / время вообще не нуждаются в часовом поясе.
Вам не нужно обрезать его с Z
. Синтаксические анализаторы времени данных Java могут анализировать спецификатор часового пояса Z
и придавать ему правильное значение ... если вы используете правильный шаблон.
Если дата-время ISO «неразборчиво», это означает, что вы (явно или неявно) использовали неправильный формат для его анализа.
К сожалению, разные страны (локали) имеют разные форматы даты / времени по умолчанию, и, что еще хуже, нет надежного способа (в целом) узнать, какой из них правильный, чтобы использовать ... если вы не знаете, откуда он появился.
К счастью ... ISO 8601 - это стандарт Международный. Если вы видите дату и время, соответствующие синтаксису ISO 8601, вы знаете, что это значит.
Существует несколько видов представления даты и даты / времени ISO 8601, как описано в Консорциуме W3 TR. Различные виды можно различить без какой-либо двусмысленности.
Если вы выполняете синтаксический анализ с использованием java.text.SimpleDateFormat
, то правильным шаблоном для этого варианта ISO 8601 является "yyyy-MM-dd'T'HH:mm:ssX"
. Шаблон, который работает с java.time.format.DateTimeFormatter
, также является "yyyy-MM-dd'T'HH:mm:ssX"
.
Класс DateTimeFormatter
также определяет ряд стандартных форматов как константы. Формат даты / времени этого типа ISO 8601 - DateTimeFormatter.ISO_OFFSET_DATE_TIME
. Определены и другие виды.
Классы Date
и Calendar
и связанные классы являются классами наследие. Вместо этого в новом коде рекомендуется использовать новые классы java.time
.
Время ISO с часовым поясом UTC ?? Но чтобы быть настоящим ISO, он должен заканчиваться на Z