DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("XX")
.toFormatter();
String str = "2020-04-15T23:00:00+0000";
OffsetDateTime dateTime = OffsetDateTime.parse(str, formatter);
System.out.println(dateTime);
Вывод:
2020-04-15T23: 00Z
Поскольку ваша входная строка содержит смещение, +0000
и часовой пояс отсутствует, предпочитайте представлять дату и время в виде OffsetDateTime
, а не ZonedDateTime
(если у вас есть определенные c причины для необходимости ZonedDateTime
, просто используйте этот класс вместо этого в приведенном выше коде, он тоже будет работать ).
Я предпочитаю использовать встроенные средства форматирования вместо написания собственной строки шаблона формата. Только для смещения я использую шаблон формата XX
(есть и другие шаблоны, которые тоже будут работать).
Я получаю вывод как 2020-04-15T23: 00Z, но мне нужен как 2020 -04-15T23: 00: 00Z с секундами, в конце которых это обрезка.
Скорее всего, нет. Формат ISO 8601, а в ISO 8601 секунды необязательны, когда они равны 0. OffsetDateTime
или ZonedDateTime
имеют полную точность (даже наносекунд). Пропуск (то, что вы назвали триммингом) происходит только в выходных данных, полученных методом toString
объекта. Если вам нужен формат ISO 8601 для какого-либо другого API или другой системы, вариант без секунд также должен работать.
Если вам нужен определенный формат, используйте второй DateTimeFormatter
для форматирования в строку в необходимого формата.
Что не так в вашем коде?
Марк Роттвил уже сказал: ISO 8601 не допускает пробела между временем и смещением UT C. Или, наоборот, когда в строке шаблона формата вы ставите пробел между ss
и Z
, при разборе потребуется пробел в проанализированной строке. Поскольку пробела не было, синтаксический анализ не удался.
Ссылки