Не удалось найти формат для этой даты: «2018-09-09T09: 04: 47 + 00: 00»

Получение ошибки

java.text.ParseException: Unparseable date: "2018-09-09T09:04:47+00:00"

Что это за формат даты?

Время ISO с часовым поясом UTC ?? Но чтобы быть настоящим ISO, он должен заканчиваться на Z

Antoniossss 09.09.2018 13:19

Если он прочитал проблему, которая является проблемой, я не смог найти, что это за формат, тогда только я могу написать форматтер.

Tanu Garg 09.09.2018 13:20

Да @Antoniossss, но это значение, которое я получаю через службу, мне нужно проанализировать, чтобы преобразовать в метку времени.

Tanu Garg 09.09.2018 13:21

@drowny ок. Спасибо.

Tanu Garg 09.09.2018 13:22

Это не моя проблема, что сервис использует нестандартные форматы времени.

Antoniossss 09.09.2018 13:23

@Antoniossss, хорошо, я думал, ты пытаешься мне помочь, поэтому объяснил проблему. Но не бери в голову..

Tanu Garg 09.09.2018 13:24
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
4
6
99
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте этот метод преобразования в 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.

Tanu Garg 09.09.2018 13:33

Я добавил альтернативный способ решения, если вы используете java8 или более позднюю версию, попробуйте его, пожалуйста. Ваша строка будет динамической в ​​конце «+00: 00» или whatelse.

drowny 09.09.2018 13:37
Ответ принят как подходящий

Вы должны использовать "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, это именно то, что я искал. Работает отлично.

Tanu Garg 09.09.2018 14:23

Лучше использовать новые классы java.time.*, чем Date и SimpleDateFormat

Stephen C 09.09.2018 14:29

Кажется, есть некоторая путаница в этом формате даты, поэтому я объясню.

  1. Это значение даты и времени ISO 8601 со смещением часового пояса.

    Использованная литература:

    • Страница ISO 8601 в Википедии точна и довольно обширна.
    • Консорциум W3 задокументировал в ТЗ; здесь.
    • Официальную версию можно получить в ISO; здесь.
  2. Z - это спецификатор часового пояса стандарта ISO. Это означает то же самое, что и +00.00, и в некоторых кругах (например, в вооруженных силах) известно как «зулусское время».

  3. Дата / время ISO 8601 не обязательно должны заканчиваться на Z. Существуют и другие формы спецификации часового пояса, и действительно, дата / время вообще не нуждаются в часовом поясе.

  4. Вам не нужно обрезать его с Z. Синтаксические анализаторы времени данных Java могут анализировать спецификатор часового пояса Z и придавать ему правильное значение ... если вы используете правильный шаблон.

  5. Если дата-время ISO «неразборчиво», это означает, что вы (явно или неявно) использовали неправильный формат для его анализа.

  6. К сожалению, разные страны (локали) имеют разные форматы даты / времени по умолчанию, и, что еще хуже, нет надежного способа (в целом) узнать, какой из них правильный, чтобы использовать ... если вы не знаете, откуда он появился.

  7. К счастью ... ISO 8601 - это стандарт Международный. Если вы видите дату и время, соответствующие синтаксису ISO 8601, вы знаете, что это значит.

  8. Существует несколько видов представления даты и даты / времени ISO 8601, как описано в Консорциуме W3 TR. Различные виды можно различить без какой-либо двусмысленности.

  9. Если вы выполняете синтаксический анализ с использованием java.text.SimpleDateFormat, то правильным шаблоном для этого варианта ISO 8601 является "yyyy-MM-dd'T'HH:mm:ssX". Шаблон, который работает с java.time.format.DateTimeFormatter, также является "yyyy-MM-dd'T'HH:mm:ssX".

  10. Класс DateTimeFormatter также определяет ряд стандартных форматов как константы. Формат даты / времени этого типа ISO 8601 - DateTimeFormatter.ISO_OFFSET_DATE_TIME. Определены и другие виды.

  11. Классы Date и Calendar и связанные классы являются классами наследие. Вместо этого в новом коде рекомендуется использовать новые классы java.time.

Другие вопросы по теме