4

当我new Date()使用 Oracle 数据库插入对象时jdbcTemplate,我可以看到 jdbc 驱动程序或 Spring jdbcTemplateDate使用本地 JVM 偏移量插入。

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date timeZoneDate = sdf.parse("09-SEP-1987");

例如,当我插入在 GMT 中创建的 Date 对象时,如果 JVM 时区是美国,则会在 Oracle 数据库中插入 08-SEP-1987。

4

2 回答 2

20

java.util.DateOracle 也不存储Date时区信息。在您的情况下,Jdbc 驱动程序使用 JVM 时区转换您的日期。您可以使用以下选项之一:

  • 如果您使用的是 PreparedStatement,您可以使用setDate(int parameterIndex, Date x, Calendar cal)方法Calendar 在 UTC 时区中指定。
  • 对于 SpringjdbcTemplate而不是插入Date对象,插入CalendarUTC
  • TimeZone.setDefault(TimeZone.getTimeZone("GMT"))可以在 JVM lvl 上设置
  • -Duser.timezone=GMT在 JVM 启动时使用
于 2012-09-26T06:37:10.733 回答
4

OracleDATE数据类型没有时区字段。它仅存储日期和时间组件。因此,当jdbc将带有时区的日期插入DATE数据库字段时,它必须决定如何处理将消失的时区信息。

在您的情况下,似乎在插入之前将jdbcjava 转换Date为语言环境时区。插入时将日期09-SEP-1987 00:00:00 UTC转换为08-SEP-1987 20:00:00 EST并删除时区信息。

知道了这一点,您可以在插入DATE字段时不指定时区,以便使用默认语言环境时区,或者同时修改默认时区和 javaDate时区。

于 2012-09-24T11:29:44.253 回答