使用 Java 和 Spring 在 Oracle 数据库中插入 UTC/GMT 日期



当我使用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时区。

最新更新