为什么我在 Oracle DB 和 Java 中有不同的时区偏移结果?
Why have I diffrent timezone offset result in Oracle DB and in 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
我有以下代码来比较 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