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

时间:2012-09-24 10:54:31

标签: java oracle jdbc timezone spring-jdbc

当我使用new Date()jdbcTemplate对象插入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。

2 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:3)

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

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

知道这一点,您可以在插入DATE字段时不指定时区,以便使用默认的区域设置时区或修改默认时区和java Date时区。