OffsetDateTime, сохраняемый JPA, отличается на 2 часа - PullRequest
3 голосов
/ 07 мая 2020

У меня есть класс сущности JPA с полем OffsetDateTime вроде этого:

@Entity
class MyEntity(clock: Clock) {
    // ...
    val created: OffsetDateTime = OffsetDateTime.now(clock)
}

В тесте репозитория я проверяю, правильно ли сопоставлена ​​дата:

assertThat(entity.created).isEqualTo(defaultDateTime)

Если Я сравниваю базовый Instant (а не также смещение) с OffsetDateTime#isEqual, он работает:

assertThat(entity.created.isEqual(defaultDateTime)).isTrue()

defaultDateTime и clock создаются с помощью этого кода:

val defaultDateTime: OffsetDateTime =
    OffsetDateTime.of(2019, 6, 15, 11, 48, 59, 0, ZoneOffset.UTC)

fun createTestClock(dateTime: OffsetDateTime = defaultDateTime) = 
    Clock.fixed(dateTime.toInstant(), ZoneId.of("UTC"))

Но если я провожу свой тест, время отличается ровно на 2 часа (каково фактическое смещение в моем регионе, центральная европа). База данных PostgreSQL возвращает GMT, если я запрашиваю часовой пояс с помощью show timezone;.

Тип данных столбца:

timestamp with time zone not null

Установка соответствующего свойства Hibernate не помогает:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

Что не так?

1 Ответ

1 голос
/ 17 мая 2020

Я считаю, что UT C и GMT имеют смещение времени (UT C), равное 0. Центральная Европа использует CET (Центральноевропейское время), которое в настоящее время имеет смещение (UT C) +2. Это объясняет, что ответ отключен на 2 часа.

Я бы порекомендовал, возможно, установить часовой пояс по умолчанию в java (в вашем основном приложении)

@PostConstruct
void started() {
  TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

и / или изменить часовой пояс БД например, от

spring.jpa.properties.hibernate.jdbc.time_zone=UTC;

до

spring.jpa.properties.hibernate.jdbc.time_zone=CET;

Я думаю, проблема может заключаться в java с использованием часового пояса по умолчанию на вашем компьютере. Когда он сравнивает Entity, я считаю, что он сравнивает их как строки UT C, поэтому они будут совпадать, но если вы сравните смещение, ваше локальное может быть CET (+2), а метка времени - UTC / GMT (+0)

Это одна из возможностей, просто я знаю Java и Postrges больше, чем Spring.

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