在我的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检查数据库内容。
答案 0 :(得分:0)
您使用了错误的数据类型。 LocalDateTime
不能代表时刻。它只是日期和时间,没有时区或UTC偏移量。
对于类似于SQL标准类型TIMESTAMP WITH TOME ZONE
的数据库列,应使用Instant
,OffsetDateTime
或ZonedDateTime
类。
Stack Overflow已经对此问题进行了很多次讨论。搜索以了解更多信息。
请勿编写代码来依赖JVM或数据库的当前默认时区。通过显式传递可选参数来指定所需/期望的区域或偏移量。