简短版: 我能强制Java忽略时区吗?
详细版: 我有一个基于Java 6的旧三层系统,其中包括一个Java GUI前端(运行在用户PC上),一个Java / OSGi中间件服务器和一个Oracle 11g数据库后端。这两个服务器位于同一机架内的集群中。存储在数据库中的主要实体(检查)具有Date列,该列存储检查发生时的日期和时间。日期和时间以字符串形式在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);
检查日期和时间,然后将其回读到中间件服务器,以识别和定位文件名中包含日期和时间的原始数据文件。从数据库中读取的方法如下:
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)时区后出现了问题。时间在存储到数据库时会向前偏移2小时,并在读取时再次向前偏移2小时。我已经确定是Java导致的问题,在这种设置下Oracle不支持时区。
我考虑更改中间件服务器的设置,将其转换为UTC进行存储,在读取时将其转换回本地时区。我知道java.util.Date已过期,并且有其他表示时间和日期的方式。然而,如果GUI客户端和服务器位于不同的时区,或者服务器或数据被移动到不同的时区,我会担心会发生什么。
最后,强制Java忽略时区可能是最合理的选择。这是否可能?
谢谢!
inspection_date
列的数据类型是什么?日期,时间戳,带时区的时间戳,带本地时区的时间戳? - krokodilko