Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取设置时区查询设置的sesson时区中的TIMESTAMPTZ列值_Java_Postgresql_Jdbc_Timestamp With Timezone - Fatal编程技术网

Java 如何读取设置时区查询设置的sesson时区中的TIMESTAMPTZ列值

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

我试图用JavaJDBC读取timestamptz数据

在postgresql上设置会话时区(连接时区)时,我希望读取会话给定时区中的所有timestamptz列。当我使用getString()方法读取resultset时,它返回预期的TimeStamp()值,但getTimestamp()方法返回jvm默认时区中的日期

以下是示例代码:

    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转换到您的时区,但您不想执行这种转换-我理解正确吗?