为什么在Oracle DB和Java中有不同的时区偏移结果?



我有以下代码来比较Oracle数据库11g(11.2.0.4.0)和Java中的'Asia/Novosibirsk'时区的时区偏移量:

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   

看这里

链路1和链路2。

根据这些链接,在2014年10月26日这个区域发生了时区偏移,这是由Java考虑到的,但不是由Oracle DB在你的版本。

希望他们在最新的一篇文章中已经改正了。

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

试着找出它们的服务器位置,并检查是否可以找到一些

相关内容

  • 没有找到相关文章

最新更新