【问题标题】:Why have I diffrent timezone offset result in Oracle DB and in Java?为什么我在 Oracle DB 和 Java 中有不同的时区偏移结果?
【发布时间】:2015-08-17 13:11:35
【问题描述】:

我有以下代码来比较 Oracle Database 11g (11.2.0.4.0) 和 Java 中“亚洲/新西伯利亚”时区的时区偏移:

import oracle.jdbc.pool.OracleDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;


public class TZTest {
    public static void main(String[] args) {

        try {

            OracleDataSource oracleDataSource = new OracleDataSource();
            oracleDataSource.setURL("jdbc:oracle:thin:@some_host/some_sid");
            oracleDataSource.setUser("some_user");
            oracleDataSource.setPassword("some_passowrd");

            try (Connection connection = oracleDataSource.getConnection();
                 Statement statement = connection.createStatement();
                 ResultSet resultSet = statement.executeQuery(
                         "SELECT TZ_OFFSET(sessiontimezone) tzo, sessiontimezone tzn FROM dual")
            ) {
                while (resultSet.next()) {
                    System.out.println(
                            String.format("From DB:   %s %s",
                                    resultSet.getString("tzn"),
                                    resultSet.getString("tzo"))
                    );
                }
            }

            ZoneId zoneId = ZoneId.systemDefault();
            LocalDateTime now = LocalDateTime.now();
            ZonedDateTime zonedDateTime = now.atZone(zoneId);
            ZoneOffset offset = zonedDateTime.getOffset();

            String out = String.format("From Java: %s %s", zoneId, offset);
            System.out.println(out);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}  

我得到了这个结果:

From DB:   Asia/Novosibirsk +07:00 
From Java: Asia/Novosibirsk +06:00

为什么这个时区的偏移量不同?

我用这个驱动和这个java版本

ojdbc6.jar  (version 11.2.0.3.0 )
java.vendor: Oracle Corporation   
java.version: 1.8.0_40           
JRE tzdata version: tzdata2015a   

【问题讨论】:

  • 数据库好像返回了夏令时(DST)。

标签: java oracle jdbc timezone offset


【解决方案1】:

看这里

Link 1Link 2

根据这些链接,该地区在 2014 年 10 月 26 日发生了时区变化,Java 考虑到了这一点,但您的版本中的 Oracle DB 没有考虑到这一点。

希望他们会在最新的版本中更正它。

【讨论】:

  • 您认为Oracle DB 11g (11.2.0.4.0) 中的问题吗?
  • 我不知道具体的版本。这是我根据搜索时获得的信息的理解。
【解决方案2】:

我不完全确定,但可能是托管您的数据库的服务器和运行您的 java 代码的服务器位于不同时区的不同数据中心。

尝试找出他们两个的服务器位置并检查是否可以找到。

【讨论】:

  • 我正要说同样的话。确保您的 Java 服务器和 Oracle 服务器都设置为相同的时区。
  • 如果这些服务器有不同的时区,它们也会返回不同的时区,而不仅仅是不同的偏移量。
  • 偏移量在 Oracle 和 Java 中都是相对于 UTC 的,因此主机的时区不会影响结果。
  • @kalyan-chavali 我在数据库中有查询“select dbtimezone from dual;”它返回“+6:00”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-11-09
  • 1970-01-01
  • 2016-07-19
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多