当我使用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。
答案 0 :(得分:19)
java.util.Date
和Oracle Date
都不存储时区信息。在您的情况下,Jdbc驱动程序使用JVM时区转换您的日期。您可以使用以下选项之一:
setDate(int
parameterIndex, Date x, Calendar cal)
方法指定Calendar
在UTC时区。jdbcTemplate
而不是插入Date
个对象,请插入Calendar
UTC
时区TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
可以在JVM lvl上设置-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
时区。