Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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/2/spring/11.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 JDBC(在springdatajpa中)在将记录插入oracledb时是否不总是采用JVM默认时区?_Java_Spring_Hibernate_Jdbc_Timezone - Fatal编程技术网

Java JDBC(在springdatajpa中)在将记录插入oracledb时是否不总是采用JVM默认时区?

Java JDBC(在springdatajpa中)在将记录插入oracledb时是否不总是采用JVM默认时区?,java,spring,hibernate,jdbc,timezone,Java,Spring,Hibernate,Jdbc,Timezone,在应用程序开始时,我使用java中的timezone.setDefaultTimezone()方法将默认时区设置为Australia/Perth。我试图在created\u date列中插入带有澳大利亚时区的时间戳。调用Spring数据JPA的save方法时,时间戳为下午4点澳大利亚时区。但是,在DB中,它存储为UTC下午4点。我们的Spring配置不强制JDBC使用UTC时区。没有指定这样的配置。事实上,UTC根本不存在于存储库中的任何位置 问题:我知道JDBC驱动程序决定时区。 Q) 它不应

在应用程序开始时,我使用java中的
timezone.setDefaultTimezone()
方法将默认时区设置为Australia/Perth。我试图在
created\u date
列中插入带有澳大利亚时区的时间戳。调用Spring数据JPA的
save
方法时,时间戳为下午4点澳大利亚时区。但是,在DB中,它存储为UTC下午4点。我们的Spring配置不强制JDBC使用UTC时区。没有指定这样的配置。事实上,UTC根本不存在于存储库中的任何位置

问题:我知道JDBC驱动程序决定时区。 Q) 它不应该总是使用JVM默认时区吗?在这种情况下,它就是澳大利亚? Q) 无论我在代码中设置了什么时区(作为默认时区或在日期列中),DB中的时区始终是UTC。但时间戳的数字部分运行正常。有没有可能,JDBC使用的是DBtimezone而不是JVM的默认时区? Q) JDBC采用-JVM的默认时区还是DB的“DBtimezone”(在本例中,它恰好是后者)?或者它可以是任何一个

信息: DB的Dbtimezone-从双UTC中选择Dbtimezone DB会议时区-亚洲/加尔各答 创建的\u日期列的类型为“带时区的时间戳”


注意:我尝试了java.time类。。OffsetdateTime和ZonedDateTime,但没有成功。

从不设置默认时区。这样做会立即影响在该JVM中运行的所有应用程序的所有线程中运行的所有其他代码。任何其他代码都可以再次重置它

因此,永远不要编写依赖于JVM当前默认时区的代码。明确指定所需/预期时区

我试图在created_date列中插入带有澳大利亚时区的时间戳

(A) 确保数据库列的类型类似于SQL标准类型带时区的时间戳

(B) 仅使用现代java.time类型

(C) 使用符合JDBC 4.2及更高版本的JDBC驱动程序

我不使用JPA。但我可以直接向您展示JDBC

ZoneId z = ZoneId.of( "Australia/Perth" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;
您可能会对工具和中间件的一个不幸的反功能感到困惑,即在从数据库检索值之后但在显示给您之前动态应用默认时区。这就产生了一种不存在的时区的错觉。尝试使用Java从DB检索您的值:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
此答案上显示的代码不会有时区问题。根据我对for和的经验,服务器或客户端上的任何默认时区都不会相互影响。坚持(a)使用java.time类,以及(b)始终指定所需/预期的时区,而不是隐式地依赖默认时区。我不使用Spring或Hibernate,所以我不知道他们是否会在这一过程中注入时区

在调试您的情况时,尝试一些直接的JDBC来从混合中消除Spring和JPA/Hibernate



顺便说一下,亚洲/加尔各答的时区已重命名为亚洲/加尔各答。确保您的操作系统、数据库引擎和Java实现中的都是最新的。

我两个都试过了……A)确定。检查了多次。B) 我也试过了。现在,观察到一个不同的问题。现在尝试设置美国/温哥华时间。插入记录前,时间为2020-05-24T00:29:27.204。插入后,是20年5月24日03.29.27.204000000 PM UTC。现在,即使是数字部分也是不同的。早些时候,至少这是正确插入的。JDBC是否总是使用dbtimezone?您可以在spring中将JDBC时区设置为hibernate:spring.jpa.properties.hibernate.JDBC.time\u zone=UTC@zlaval-当我将数据库中列的类型从TIMESTAMP WITH TIMEZONE更改为String时,它运行良好。它正在插入我发送的时区。JDBC也考虑DB服务器时区(在这种情况下是UTC)还是只依赖JVM默认时区?这是一个没有人回答过的问题。@PraveenNvs向带有时区的
时间戳类型的数据库列发送
OffsetDateTime
,并不涉及任何时区调整,而是调查特定JDBC驱动程序的行为。此外,您可能会对工具和中间件的一个不幸的反功能感到困惑,即在从数据库检索值之后但在显示给您之前动态应用默认时区。这就产生了一种不存在的时区的错觉。尝试使用Java从DB检索您的值:
OffsetDateTime odt=myResultSet.getObject(…,OffsetDateTime.class)
@PraveenNvs尝试一些直接的JDBC来消除混合中的Spring和Hibernate。