【问题标题】:Insert UTC/GMT date in Oracle database with Java and Spring使用 Java 和 Spring 在 Oracle 数据库中插入 UTC/GMT 日期
【发布时间】:2012-09-15 19:48:48
【问题描述】:

当我使用jdbcTemplatenew 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 中创建的 Date 对象时,如果 JVM 时区是美国,则会在 Oracle 数据库中插入 08-SEP-1987。

【问题讨论】:

  • 你的数据库中的相关列是如何声明的?
  • 在数据库中我有日期类型

标签: java oracle jdbc timezone spring-jdbc


【解决方案1】:

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

  • 如果使用PreparedStatement,可以使用setDate(int parameterIndex, Date x, Calendar cal)方法指定Calendar 在 UTC 时区。
  • 对于 Spring jdbcTemplate 而不是插入 Date 对象,插入 CalendarUTC 时区
  • TimeZone.setDefault(TimeZone.getTimeZone("GMT")) 可以在 JVM lvl 上设置
  • 在 JVM 启动时使用 -Duser.timezone=GMT

【讨论】:

  • 不知道插入日历对象。不错!
  • +1,带有日历对象的 springjdbc 模板非常适合我
【解决方案2】:

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

在您的情况下,jdbc 似乎在插入之前将 java Date 转换为区域设置时区。日期09-SEP-1987 00:00:00 UTC 转换为08-SEP-1987 20:00:00 EST,插入时删除时区信息。

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

【讨论】:

  • 转换为本地时区是 JDBC API 文档的要求:"使用正在运行的虚拟机的默认时区将指定参数设置为给定的 java.sql.Date 值应用程序。” PreparedStatement.setDate()
  • 当您的 Oracle 列数据类型是时间戳时,是否也会发生这种转换?
  • @supertonsky Oracle TIMESTAMP 数据类型没有时区组件,因此行为应该相同。如果要存储时区数据,可以使用TIMESTAMP WITH TIME ZONE 数据类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2010-12-09
  • 2016-08-27
  • 2012-09-18
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多