jOOQ устанавливает временные метки с местным часовым поясом, когда ожидалось UTC - PullRequest
0 голосов
/ 22 мая 2019

В моем файле конфигурации jOOQ у меня есть эта строка:

<javaTimeTypes>true</javaTimeTypes>

Если я создаю эту таблицу в HSQLDB:

CREATE TABLE T1 (C1 TIMESTAMP DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP NOT NULL);

Сгенерированный код jOOQ выглядит следующим образом:

public final TableField<T1Record, LocalDateTime> C1 =
createField("C1", org.jooq.impl.SQLDataType.LOCALDATETIME.nullable(false).
defaultValue(org.jooq.impl.DSL.field("LOCALTIMESTAMP",
org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "");

Моя JVM начинается с часового пояса CET и, независимо от того, установил я его или нет на GMT перед созданием DSLContext, при вставке или обновлении строк (без явного задания значения), jOOQ всегда использует CETчасовой пояс.

При непосредственном использовании JDBC в GMT вставляются метки времени, что мне и нужно.
Как настроить jOOQ для получения того же эффекта?

Я проверяюсодержимое базы данных с IntelliJ IDEA.

1 Ответ

0 голосов
/ 22 мая 2019

Вы используете неправильный тип данных. LocalDateTime не может представлять момент. Это только дата и время дня, без часового пояса или смещения от UTC.

Для столбца базы данных, похожего на стандартный тип SQL TIMESTAMP WITH TOME ZONE, следует использовать классы Instant, OffsetDateTime или ZonedDateTime.

Это уже много раз освещалось в Переполнении стека. Поиск, чтобы узнать больше.

Не пишите свой код в зависимости от текущего часового пояса по умолчанию вашей JVM или вашей базы данных. Укажите желаемую / ожидаемую зону или смещение, явно указав необязательный аргумент.

...