LocalDateTime не является ISO8601 по умолчанию - PullRequest
0 голосов
/ 04 сентября 2018

Я использую LocalDateTime для представления времени. В режиме отладки я заметил, что формат времени не соответствует ISO 8601, что затрудняет его отправку напрямую на другие apis.

Класс запроса:

public class AgreementRequest {
    @NonNull
    private String name;
    @NonNull
    private String description;
    @JsonProperty("start_date")
    @DateTimeFormat(iso = DATE_TIME)
    @NonNull
    private String startDate;
}

Инициализация:

request = AgreementRequest.builder()
                .name("Premium subscription")
                .description("Montly subscription")
                .startDate(LocalDateTime.now().plusDays(1).toString()).build();

enter image description here

LocalDateTime.toString также отсутствует в ISO 8601, буква z в ISO8601 пропала.

У меня objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); отключен, это проблема?

1 Ответ

0 голосов
/ 04 сентября 2018

LocalDateTime.toString также отсутствует в ISO 8601, буква Z в ISO8601 пропала.

LocalDateTime описание даты, используемой для дней рождения, в сочетании с местным временем, показанным на настенных часах. Он не может представлять момент на временной шкале без дополнительной информации, такой как смещение или часовой пояс.

Z - это указатель зоны для нулевого смещения UTC, и поэтому вы не увидите его при вызове toString() из экземпляра LocalDateTime. Используйте ZonedDateTime или OffsetDateTime, если вам нужен часовой пояс или смещение.

Чтобы (де) сериализовать типы JSR-310 с Джексоном, рассмотрим JavaTimeModule. См. документацию для подробностей.


Должен ли я использовать Instant вместо LocalDateTime? Если так, что я должен изменить в моей БД PostgreSQL?

Проверьте, что об этом говорит драйвер JDBC PostgreSQL Документация :

Драйвер JDBC PostgreSQL ™ реализует встроенную поддержку API даты и времени Java 8 (JSR-310) с использованием JDBC 4.2.

PostgreSQL™                     | Java SE 8
--------------------------------+----------------
DATE                            | LocalDate
TIME [ WITHOUT TIMEZONE ]       | LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ]  | LocalDateTime
TIMESTAMP WITH TIMEZONE         | OffsetDateTime

[...] Обратите внимание, что ZonedDateTime, Instant и OffsetTime / TIME [ WITHOUT TIMEZONE ] не поддерживаются. Также обратите внимание, что все OffsetDateTime экземпляры будут в UTC (со смещением 0).

Это потому, что бэкэнд хранит их как UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...