当我使用jdbcTemplate
new Date()
对象插入Oracle数据库时,我可以看到jdbc驱动程序或Spring jdbcTemplate使用本地JVM偏移量插入Date
。
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date timeZoneDate = sdf.parse("09-SEP-1987");
例如,当我插入在 GMT 中创建的日期对象时,如果 JVM 时区是美国,则在 Oracle 数据库中插入 08-SEP-1987。
java.util.Date
和 Oracle 都不Date
存储时区信息。在您的情况下,Jdbc 驱动程序使用 JVM 时区转换您的日期。您可以使用以下选项之一:
- 如果您使用的是 PreparedStatement,则可以使用
setDate(int parameterIndex, Date x, Calendar cal)
方法来指定Calendar
采用 UTC 时区。 - 对于 Spring
jdbcTemplate
,不要插入Date
对象,而是插入具有UTC
时区的Calendar
-
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
可以在 JVM lvl 上设置 - 在 JVM 启动时使用
-Duser.timezone=GMT
Oracle DATE
数据类型没有时区字段。它只存储日期和时间组件。因此,当jdbc
将带有时区的日期插入DATE
数据库字段时,它必须决定如何处理将消失的时区信息。
在您的情况下,似乎jdbc
在插入之前将 java Date
转换为区域设置时区。09-SEP-1987 00:00:00 UTC
日期将转换为08-SEP-1987 20:00:00 EST
,时区信息在插入时被删除。
知道这一点后,您可以在插入DATE
字段时不指定时区,以便使用默认区域设置时区,或者同时修改默认时区和 java Date
时区。