PostgreSQL (PolarDB PG 16) SELECT now() всегда возвращает часовой пояс Азии/Шанхая через JDBC, даже если часовой пояс БДJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 PostgreSQL (PolarDB PG 16) SELECT now() всегда возвращает часовой пояс Азии/Шанхая через JDBC, даже если часовой пояс БД

Сообщение Anonymous »

Я использую PolarDB для PostgreSQL 16 и приложение Java с драйвером PostgreSQL JDBC.
В своем Java-коде я выполняю простой запрос:

Код: Выделить всё

String query = "SELECT now();";
try {
conn2 = driver2.connect(url2, info2);
stmt2 = conn2.prepareStatement(query);
rs2 = stmt2.executeQuery();
while (rs2.next()) {
String result = rs2.getString(1);
System.out.println("Query Result: " + result);
}
} catch (SQLException e) {
System.out.println("Connection failed!");
e.printStackTrace();
} finally {
try {
if (rs1 != null) rs1.close();
if (rs2 != null) rs2.close();
if (stmt1 != null) stmt1.close();
if (stmt2 != null) stmt2.close();
if (conn1 != null) conn1.close();
if (conn2 != null) conn2.close();
System.out.println("Resources closed!");
} catch (SQLException e) {
e.printStackTrace();
}
}
Независимо от того, как я меняю настройку часового пояса базы данных, результат, напечатанный этим кодом Java, будет всегда в Азии/Шанхае.
Что я вижу в psql
Если я подключаюсь к psql:

Код: Выделить всё

youyou=> show timezone;
TimeZone
----------
UTC
(1 row)

youyou=> select now();
now
-------------------------------
2026-02-25 02:17:23.056023+00
(1 row)
и

Код: Выделить всё

youyou=> show timezone;
TimeZone
---------------
Asia/Shanghai
(1 row)

youyou=> select now();
now
-------------------------------
2026-02-25 10:18:05.671536+08
(1 row)
psql ведет себя так, как ожидалось.
Что я вижу в Java
При использовании одной и той же базы данных, когда я запускаю свой Java-код в обеих конфигурациях (часовой пояс БД = UTC и часовой пояс БД = Азия/Шанхай), я всегда получаю:

Код: Выделить всё

Connected!
Query Result: 2026-02-25 10:19:03.137973+08
Resources closed!

Connected!
Query Result: 2026-02-25 10:19:51.019322+08
Resources closed!
Поэтому через JDBC SELECT now() всегда возвращает +08, даже когда show timezone в psql возвращает UTC.
Мои вопросы
  • Почему JDBC всегда показывает мне время Азии/Шанхая, даже если часовой пояс базы данных установлен в UTC, а psql показывает UTC?
  • Каков рекомендуемый/элегантный способ контролировать это в коде приложения? Например:
    • Должен ли я явно установить часовой пояс сеанса после установления соединения?
    • Или мне следует передать параметр часового пояса в URL-адресе JDBC?
Любое подробное объяснение того, как PostgreSQL / PolarDB + JDBC обрабатывает Буду признателен за часовые пояса и способы получения согласованных временных меток UTC в моем Java-приложении.

Подробнее здесь: https://stackoverflow.com/questions/798 ... imezone-vi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»