jOOQ使用当地时区设置时间戳(预计UTC)

时间:2019-05-22 02:33:03

标签: java sql jooq

在我的jOOQ配置文件中,有以下一行:

    DatagramSocket aSocket = null;
    try{
        //Create a UDP socket on the agreed port
        aSocket = new DatagramSocket(6789);

        //Define a buffer of enough size
        byte[] buffer = new byte[100];
        while(true){

            //Waiting for requests
            DatagramPacket request = new DatagramPacket(buffer, buffer.length);
            aSocket.receive(request); 

            //Create a thread to process the request
            new Processing1(aSocket, request);
        }
    }catch (SocketException e){System.out.println("Socket: " + e.getMessage());
    }catch (IOException e) {System.out.println("IO: " + e.getMessage());
    }finally {if(aSocket != null) aSocket.close();}
}

如果我在HSQLDB中创建此表:

<javaTimeTypes>true</javaTimeTypes>

生成的jOOQ代码如下:

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

我的JVM以CET时区开始,无论在创建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, ""); 之前是否将其设置为GMT,在插入或更新行(未明确设置值)时,jOOQ始终使用CET时间区域。

当我直接使用JDBC时,时间戳就是插入到GMT中。
如何配置jOOQ具有相同的效果?

我正在使用IntelliJ IDEA检查数据库内容。

1 个答案:

答案 0 :(得分:0)

您使用了错误的数据类型。 LocalDateTime不能代表时刻。它只是日期和时间,没有时区或UTC偏移量。

对于类似于SQL标准类型TIMESTAMP WITH TOME ZONE的数据库列,应使用InstantOffsetDateTimeZonedDateTime类。

Stack Overflow已经对此问题进行了很多次讨论。搜索以了解更多信息。

请勿编写代码来依赖JVM或数据库的当前默认时区。通过显式传递可选参数来指定所需/期望的区域或偏移量。