Java 如何读取设置时区查询设置的sesson时区中的TIMESTAMPTZ列值
我试图用JavaJDBC读取timestamptz数据 在postgresql上设置会话时区(连接时区)时,我希望读取会话给定时区中的所有timestamptz列。当我使用getString()方法读取resultset时,它返回预期的TimeStamp()值,但getTimestamp()方法返回jvm默认时区中的日期 以下是示例代码:Java 如何读取设置时区查询设置的sesson时区中的TIMESTAMPTZ列值,java,postgresql,jdbc,timestamp-with-timezone,Java,Postgresql,Jdbc,Timestamp With Timezone,我试图用JavaJDBC读取timestamptz数据 在postgresql上设置会话时区(连接时区)时,我希望读取会话给定时区中的所有timestamptz列。当我使用getString()方法读取resultset时,它返回预期的TimeStamp()值,但getTimestamp()方法返回jvm默认时区中的日期 以下是示例代码: try { Class.forName("org.postgresql.Driver"); Connection co
try {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/tztestdb", "postgres", "123456");
Statement setTZ = connection.createStatement();
setTZ.execute("SET timezone='UTC'");
//setTZ.execute("SET timezone='Europe/Istanbul'");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT datetimetzcol,datetimecol FROM TZTEST");
ResultSetMetaData jMetadata = rs.getMetaData();
int ColumnType = jMetadata.getColumnType(1);
while (rs.next()) {
System.out.println("STRING: " + rs.getString(1) + " TYPE ->" + ColumnType);
System.out.println("TIME S: " + rs.getTimestamp(1) + " TYPE ->" + ColumnType);
}
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
以下是输出:
字符串:2020-01-01 07:00:00+00类型->93
时间S:2020-01-01 10:00:00.0类型->93
我的数据库表包含两列,第一列是timestamp,第二列是timestamp。当我在mysql中测试一个类似的代码时,会返回与postgresql不同的相同日期
另外,当我读取带有时区信息的timestamptz列时,没有任何变化。这是我的附加行:
System.out.println(rs.getTimestamp(1, Calendar.getInstance(TimeZone.getTimeZone("UTC"))));
输出相同:
2020-01-01 10:00:00.0
我的期望值是:
2020-01-01 07:00:00.0
是否有一种解决方案可以避免在jvm的默认时区中读取timestamptz列。我只想读取会话时区中的数据,我用set timezone query设置了它。使用
getObject(1,OffsetDateTime.class)
停止使用java.sql.Timestamp
(顺便说一句:Cass.forName()
加载驱动程序已经很长时间了)getObject(1,OffsetDateTime.class)总是返回UTC时间。当我取消注释->setz.execute(“SET timezone='Europe/Istanbul'”)行时;它仍然返回UTC。我不想在返回日期时进行时区操作。您希望从UTC转换到您的时区,但您不想执行这种转换-我理解正确吗?