Новый Java 8 Time API предоставляет DateTimeFormatter
, где вы можете установить конец формата на один или несколько x
или X
. Согласно описанию API:
Смещение X и x: форматирует смещение на основе количества букв шаблона. Одна буква выводит только час, например, «+01», если минута не равна нулю, в этом случае также выводится минута, например, «+0130». Две буквы выводят час и минуту без двоеточия, например «+0130». Три буквы выводят часы и минуты с двоеточием, например, «+01: 30». Четыре буквы выводят час и минуту и необязательную секунду без двоеточия, например «+013015». Пять букв выводят часы и минуты и необязательную секунду с двоеточием, например «+01: 30: 15». Шесть или более букв выбрасывают исключение IllegalArgumentException. Буква шаблона «X» (верхний регистр) будет выводить «Z», когда смещение для вывода будет нулевым, а буква шаблона «x» (нижний регистр) будет выводить «+00», «+0000» или «+00». : 00 '.
Итак, в вашем случае ваша строка форматирования должна заканчиваться xxx
для +1:30
, например, "yyyy-MM-dd'T'HH:mm:ss.SSSxxx"
с SSS
, всегда дающим миллисекунды.
Чтобы использовать это DateTimeFormatter
с Джексоном, вам нужно либо определить собственный сериализатор
public class DefaultZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime> {
private static final DateTimeFormatter ISO_8601_FORMATTER = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.withZone(ZoneId.of("UTC"));
@Override
public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null) {
throw new IOException("ZonedDateTime argument is null.");
}
gen.writeString(ISO_8601_FORMATTER.format(value));
}
и аннотировать соответствующие поля в ваших бобах с помощью
@JsonSerialize(using = DefaultZonedDateTimeSerializer.class)
private ZonedDateTime someTimeProperty;
, либо вам нужно преобразовать из DateTimeFormatter
в DateFormat
(более старый, но используемый Джексоном), как описано здесь: Использование DateTimeFormatter с ObjectMapper