gpt4 book ai didi

java - JDBC 和 oracle 数据库时区处理

转载 作者:行者123 更新时间:2023-11-29 02:57:41 24 4
gpt4 key购买 nike

我已经在 oracle DB 中创建了示例表,如下所示

"CREATED_ON" TIMESTAMP (6), 
"CREATED_ON_TIMEZONE" TIMESTAMP (6) WITH TIME ZONE,
"TIMEZONE_GMT" TIMESTAMP (6) WITH TIME ZONE

并从 java 中插入值,如下所示

preparedStatement.setTimestamp(1, new Timestamp(new Date().getTime()));
preparedStatement.setTimestamp(2, new Timestamp(new Date().getTime()));
preparedStatement.setTimestamp(3, new Timestamp(new Date().getTime()) ,Calendar.getInstance(TimeZone.getTimeZone("UTC")));

亚洲/加尔各答的 JVM 时区。我已经使用 SQL 开发人员来查询数据。我只是想澄清一下我的理解

  1. 第一列根据没有时区的本地 JVM 存储值,因为数据类型只是时间戳,即 29-NOV-17 07.04.28.014000000 PM。因此,对于具有时间戳数据类型的列,DB 存储由 JDBC 驱动程序传递的本地 JVM 的值,并且 JDBC 端或 DB 端都没有发生转换?

  2. 第二列使用 TIMEZONE 存储值,即 29-NOV-17 07.04.28.014000000 PM亚洲/加尔各答。那么这是否意味着 DB 存储具有 JDBC 驱动程序提供的时区信息的列的值,并且在 DB 端没有转换?

  3. 我想在 GMT 中存储值,所以我将第三个参数设置为 GMT,它在 GMT 中存储值,但时区仍显示为本地 JVM。即 29-NOV-17 01.34.28.014000000 PM ASIA/CALCUTTA

我指的是下面的文章,但我的观察结果看起来完全不同。 http://brian.pontarelli.com/2011/08/16/database-handling-for-timezones/

最佳答案

问题是 Java Timestamp 不包含任何时区信息。

因此,您将 TIMESTAMP 值插入到 TIMESTAMP WITH TIME ZONE 的列中。在这种情况下,Oracle 使用 FROM_TZ 进行隐式转换。 :

FROM_TZ(<your value>, SESSIONTIMEZONE)

命令 preparedStatement.setTimestamp(3, new Timestamp(new Date().getTime()) ,Calendar.getInstance(TimeZone.getTimeZone("UTC"))); 只有在ALTER SESSION SET TIME_ZONE = 'UTC';

关于java - JDBC 和 oracle 数据库时区处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47555066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com