【发布时间】:2016-05-26 10:58:29
【问题描述】:
短版: 我可以强制 Java 不知道时区吗?
加长版: 我有一个较旧的、基于 Java 6 的三层系统,带有一个 Java GUI 前端(在用户 PC 上运行)、一个 Java/OSGi 中间件服务器和一个 Oracle 11g 数据库后端。两台服务器位于集群内的同一机架中。存储在数据库中的主要实体(检查)有一个日期列,该列存储检查发生瞬间的日期和时间。日期和时间在 GUI 中作为字符串输入,并存储在 DB 中,如下所示:
(theInspection.getInspectionDate() returns a java.util.Date object)
inspectionDate = new java.sql.Timestamp(theInspection.getInspectionDate().getTime());
...
statementHandler.openPreparedStatement(C_INSERT_INTO_INSPECTIONS);
...
statementHandler.setTimestamp(4, inspectionDate);
然后将检查日期和时间读回中间件服务器,以识别和定位文件名中包含日期和时间的原始数据文件。从 DB 读取如下:
resultSet.getDate("inspection_date");
if (resultSet.wasNull()) {
inspection.setInspectionDate(null);
} else {
date = new java.util.Date(resultSet.getDate("inspection_date").getTime()
+ resultSet.getTime("inspection_date").getTime() + (3600 * 1000L) );
inspection.setInspectionDate(date);
}
现在,这在 CET/CEST (UTC+1) 时区运行多年,但将其移至 MSK (UTC+3) 时会破坏它。时间在存储到 DB 时移动了 +2 小时,并在读回时再次移动了 +2 小时。我已经确定是 Java 执行此操作,Oracle 在此设置中是时区无知的。
我正在考虑更改此设置,以便中间件服务器在存储时转换为 UTC,并在读取时转换回本地时区。我知道 java.util.Date 已被弃用,并且还有其他表示时间和日期的方法。但是,我担心如果 GUI 客户端和服务器位于不同的时区,或者服务器或数据跨时区移动会发生什么。
最后,强制 Java 不知道时区可能是最有意义的。这可能吗?
谢谢!
【问题讨论】:
-
inspection_date列的数据类型是什么?日期、时间戳、带时区的时间戳、带本地时区的时间戳? -
日期,没有任何时区数据。
-
两台服务器的操作系统时区是否相同; Java 是否依赖于它,或者您是否指定了覆盖操作系统的语言环境?
-
是的,两台服务器都在同一个时区。没有覆盖操作系统的语言环境。 GUI 客户端可能位于不同的时区,但 java 到数据库的转换发生在服务器上,我相信这是插入偏移量的地方。
-
您能否告诉我们您使用的是哪个版本的 Oracle JDBC 驱动程序?他们改变了从 9.2 版开始的日期行为,请参见:oracle.com/technetwork/database/enterprise-edition/…
标签: java oracle date datetime timezone